暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ASP.Net之笔记12-14(高级-模拟事件模型)

百变则是新 2019-11-04
310


高级-模拟事件模型
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的全部内容。


文章转载自百变则是新,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论