
高级-模拟事件模型
1、接下来,说一下:HttpModule
1)我们新建一个类(MyHttpModule),实现接口(IHttpModule)。接口里面有两个方法:Dispose() 和 Init()。
2)Dispose()方法,在释放的时候来执行这个方法。
3)Init()方法,该方法的参数是 HttpApplication的实例,即当前程序的Application对象。
(1)在Init()方法中,我们可以注册事件。我们可以注册管道中第一次处理请求的事件(BeginRequest)。
eg:
public void Init(HttpApplication context)
{
//注册了HttpApplication 第一个事件
context.BeginRequest += context_BeginRequest;
}
void context_BeginRequest(object sender, EventArgs e)
{
//sender 就是我们当前的HttpApplication 对象
var app = sender as HttpApplication;
//通过app对象,我们就可以拿到Response(响应)对象。向响应流中写入内容。
app.Response.Write("这是来自HttpModule的代码<br/>");
}
4)一般实现IHttpModule接口的类的Init()方法,都是注册Application中的事件。注册完事件以后,写一个响应方法就行了。
5)咱们的这个IHttpModule接口的派生类,如何与 管道 结合起来呢?【重点】
(1)通过配置文件 配置来使他们结合在一起。
(2)在web.config文件中,在 <configuration>\<system.web>\<httpModules>\<add> 节点中,来配置我们的HttpModule。
(3)在<add>节点中,通过属性(name)指定一个名称。属性(type)关联 我们自定义的 IHttpModule接口的派生类,属性的值是 该类型的完全限定名称;该属性值 可以在类型的完全限定名称后 紧跟一个逗号,再加上该项目程序集的名称。【新点,重点,关键点】
eg:
IIS 集成模式的配置(IIS7)
<configuration>
<system.web>
<httpModules>
<add name="DemoModule" type="WebDemo.Web2019.MyHttpModule,WebDemo.Web2019" >
</httpModules>
</system.web>
</configuration>
IIS经典模式的配置(IIS6)
<configuration>
<system.webServer>
<modules>
<add name="DemoModule" type="WebDemo.Web2019.MyHttpModule,WebDemo.Web2019" >
</modules>
</system.webServer>
</configuration>
(4)上述的配置,就把我们刚才写的类型 注册到HttpModule里面来了。注册到HttpModule之后,咱们Application在执行的时候,就会把所有的HttpModule初始化好,然后调用HttpModule中的Init()方法。咱们的Init()方法中就注册了管道的事件。这样咱们的HttpModel就与咱们的Application结合到一块了。
6)不管你执行任何一个页面,都会执行HttpModule中注册的事件。【重点】
7)我们的这个HttpModule,跟我们的Global.asax文件一样,也是可以帮我们注册管道中的事件的一种机制。
8)为什么有了Global.asax文件,还要加上HttpModule呢?Global.asax文件本身就可以注册管道事件,干嘛再加一个呢?【重点】
(1)Global.asax文件本身,可以通过 Application 前缀,加上事件名称,就可以注册指定的事件的处理方法。
(2)因为Global.asax文件是固定的。如果你想要去掉其中的某个事件,就要改代码。【核心】
(3)使用HttpModule呢,我们如果想要去掉其中的某个注册事件,直接在配置文件中,把配置去掉就可以了。【核心】
(4)这样,我们注册管道事件就很方便了。
2、在<configuration>\<system.webServer>\<handlers>\<add>节点中,添加全局一般处理程序。
1)在<add>节点中,通过属性(name)给它指定一个名称。
2)通过属性(Verb)指定请求后台的方式,值为 POST 、 GET 、 *,如果有多种方式,使用","逗号隔开;"*"代表 请求的任何方式都可以。
3)通过属性(path)指定限定的请求地址,只有满足条件的地址才可以触发全局的一般处理程序。
4)通过属性(type)指定 一般处理程序的类型。值是 这个类型为完全限定名。
(1)eg:
<configuration>
<system.webServer>
<handlers>
<add name="SampleHandler2" verb="*" path="*.tf" type="WebDemo.Web2019.FileDemo,WebDemo.Web2019" resourceType="Unspecified" >
</handlers>
</system.webServer>
</configuration>
(2)上述的配置,就是任何方式的请求,任何以 .tf 最为后缀的请求,都将交由 WebDemo.Web2019.FileDemo 来处理。
5)通过这个配置,我们可以配一个 某种后缀的请求,指定哪一个一般程序来处理。
6)全局一般处理程序作用:可以用来做防盗链的处理。针对所有图片的请求交给一个全局一般程序来处理。
3、集成配置环境 与 经典配置环境。
1)IIS后来有一个集成模式,集成模式就是AspNet 与 IIS集成到一块了。这就是集成模式。
2)经典模式:指的就是IIS 6。
3)经典模式与集成模式的区别,参考连接诶:https://blog.csdn.net/laiyue2014/article/details/95270640
4、在请求的过程中,请求来到服务器后台,如果是静态文件的话 直接处理。如果是动态文件(.aspx,.ashx)则交给aspnet_isapi.dll处理。但是对于后缀文件(.php,.jsp),咱们的aspnet_isapi.dll则就识别不了了。怎么办呢?
1)这个过程怎么来做呢?在咱们的IIS中,点击网站,针对功能视图,里面有一个 “处理程序映射”
2)双击“处理程序映射”打开。这里面控制着 请求交给谁来处理。我们可以 看一下 文件后缀(.aspx) 交给谁来处理。
3)我们可以看到 .aspx文件,是交个 aspnet_isapi.dll处理的。
4)只有注册后缀的请求,才能交给相应的一般处理程序来处理。
5)我们之前 通过添加全局一般处理程序,指定的 后缀文件(*.tf),没有注册到“处理程序映射”中来,即:没有配置将该后缀的请求,交给咱们 aspnet_isapi.dll来处理。那么你要想让在IIS里面也能处理特殊后缀名的请求怎么办呢?你必须给它添加一个路径的处理,即“添加脚本映射”。参考之前的规则,添加一个。
5、通过HttpApplication池获取一空闲的HttpApplication对象,如果池子空,那么通过Global.asax文件编译的HttpApplication类型反射一个实例处理。
1)反射出一个Application实例以后,它内部立即调用了InitInteral()方法。
2)该方法把配置文件中所有的HttpModule加载出来,并创建实例,然后调用HttpModule中的Init()方法。
3)HttpModule中Init()方法什么时候被调用呢?就是在HttpApplication实例创建完了之后把配置文件中所有的HttpModule加载出来,然后每一个HttpModule中的Init()方法都会被调用。即:只要HttpApplication对象被实例化,就立马来调用HttpModule中的Init()方法,同时把 HttpApplication对象的实例传递进来。【重点】
4)然后在HttpModule的Init()方法中注册,后面管道中的事件。
5)这就是咱们ASP.Net的全部内容。





