HttpModule



HttpModule 是一个HTTP过滤模块,通过类似插件的方式注册asp.net应用程序生命周期的事件

平常当一个请求过来以后,请求走的那个管道就是整个的HttpApplication这类中的 一切触发的事件。在这个管道中,我们可以在Global.asax文件中注册应用程序生命周期的19个处理事件。这样做是可以的。但是这样好像又太单一了,是不是我想处理用户请求只能在再这个HttpApplication这个管道中来写注册事件呢?我们并没有其他办法来拦截这个请求做进一步处理。
想要拦截用户请求,只能在HttpApplication这个管道事件中来写。但是这样也没有办法保证一开始,就在HttpApplication管道事件中把所有的代码都写全吗?能保证发布网站后,没有新的需求吗?(因为网站发布后不太好改源代码,比如网站发布以后写在Global.asax中的程序代码都没有了,源代码都已经编译到bin文件夹中的dll文件里面了) 答案是不太可能。

现在有可能存在这样的一个问题,比如说我这个网站已经发布了,我突然想在网站添加一个管道处理程序(例如:如果访问的IP是192.168.1.109我就不让他访问。让它跳转到另外一个页面)

HttpModule的主要作用就是给整个管道中注册19个事件中的任何事件(一开始我们只能在Global.asax中来注册,现在有了HttpModule后,你不用Global.asax 我们在任何地方都可以注册这19个事件中的任何事件,即便网站都已经发布了,不改Global.asax也能给它注册这19个事件中的任何事件)

所以说HttpModule主要是用来截获HTTP请求的。截获HttpApplication管道事件的,它的好处就是,不改网站,甚至连网站重启都不需要,只要加这个一个dll组件进去就可以了。

首先网站已经发布了,我们改源代不太合适,那么我们就添加一个HttpModule 那么这个HttpModule怎么添加呢?

我们可以独立建立一个项目,项目里只添加类库就行了。(到时候这个项目就像插件一样插入到我们原有的项目中)



假设网站已经发布,我我想给这个网站添加一个新的功能,就是192.168.1.101这个Ip地址访问该网站的时候,就让它自动跳转到http://www.hao123.com.其实就是禁止访问的意思。那现在呢,我又不想在Global.asax文件中改,因为如果在Global.asax中的httpApplication管道事件中写,就需要重新编译网站,重新发布。这样很麻烦。

那我现在就不想在Global.asax中写HttpApplication管道事件,不想重新编译网站,重新发布网站。那我我怎么做呢?

答案就是写一个独立新建一个项目,在这里项目里添加一个类库。然后让类库中的一个类继承 IHttpModule这个接口。然后实现这个接口就可以了。

第一步:建立一个项目 随便去个名字,就叫Web.StopIP吧

StoIp类的内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace Web.StopIP
{
    //这个自定义类要继承自IhttpModule接口。要使用这个接口需要添加引用System.Web
    public class StopIp : IHttpModule
    {
        
        public void Dispose()
        {
            //throw new NotImplementedException();这个方法不需要我们管
        }

        public void Init(HttpApplication context)
        {
            //既然这里可以拿到context上下文。那么我们就在这个Init方法中添加一个HttpApplication管道事件19个事件之一的BeginRequest事件
            context.BeginRequest += new EventHandler(context_BeginRequest);

            //也可以这样注册一个事件.与上面也是一样的
            // context.BeginRequest+=context_BeginRequest;

            //当然这里也可以注册HttpApplication管道19个事件中的其他的。如
            //context.PostAcquireRequestState+=.........;
            //context.PostLogRequest+=.........;
            //等等。这19个事件都可以通过context.  点出来


        }




        //这个就是HttpApplication管道事件中的BeginRequest事件

        void context_BeginRequest(object sender, EventArgs e)
        {
            //注意:这个context_BeginRequest事件是HttpApplication的事件,所以这个sender就是Init方法中的参数HttpApplication

            HttpApplication ha = sender as HttpApplication;
            string ip= ha.Request.UserHostAddress;
            if (ip == "192.168.1.101")
            {
                ha.Response.Redirect("http://www.baidu.com");
            }
        }
    }
}


写好功能以后我们准备生产一下解决方案。

在VS中解决方案配置有两种方式选择:Debug和Release 。我们选择Release

Debug:调试版本,包含调试信息,不对代码进行任何优化,便于程序员调试程序。在调用的时候可按F5进入程序调试。

Release:发布版本,往往进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。正式发布必须采用Release版本。


然后重新生成一下解决方案



生成以后,我们点击项目,右键。选择 在资源管理器中打开文件夹

然后会在项目文件夹下看到一个bin文件夹

打开bin文件夹找到Release文件夹

打开Release文件后,将里面通过编译生成的 Web.StopIP.dll 复制到 原本网站的bin文件夹中(注意:原本网站已经发布,所以这里是将Web.StopIP.dll文件复制到发布后的网站目录的bin目录中)

现在我们已经将这个dll文件添加到了原本网站的bin目录中了。可是网站并不知道啊,怎么让网站知道呢?对在配置文件中添加一下代码

然后再在原本网站的web.config配置文件的<system.web>节点下添加如下代码

<httpModules>
         <add name="m1" type="Web.StopIP.StopIp,Web.StopIP"/>
 </httpModules>
注意:这个name 是可以随便取的。

type="使用类的完全限定名称 ,应用程序集的名称"   (怎么找应用程序集的名称? 右键项目名称,属性,然后就可以看到应用程序集的名称了)


此时基本已经将这个HttpModule添加到原本网站中了。

我们在IIS下浏览一下网页。发现报错了

这个异常我们有两种解决办法: (推荐第一种解决办法)

第一种解决办法:其实我们刚刚添加的那段代码是过时了的。我们应该重新配置。 即在<configuration>节点下添加以下这段代码:,

 <system.webServer>
    <modules>
      <add name="m1" type="Web.StopIP.StopIp,Web.StopIP"/>
    </modules>
  </system.webServer>

删除刚刚添加的这段代码

<!--<httpModules>
        <add name="m1" type="Web.StopIP.StopIp,Web.StopIP"/>
 </httpModules>-->

第二种方法:不用删除刚刚添加的<httpModules>这个节点,只要将应用程序池里面的托管管道模式修改为经典模式就可以了。

这时候我们只要打开IIS。进行如下操作。就可以了。


我们再浏览一下网站,发现功能已经实现了





 

如果以上都配置好。却还报一下错误怎么办?

解决方法:打开IIS 在功能模块区域打开“ISAPI 和 CGI 限制”。然后将限制设为允许。就OK了

如果找不到“ISAPI 和 CGI 限制” 就在筛选框中搜索“ISAPI 和 CGI 限制” 就能找到了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值