• IHttpModule


     1 IHttpModule向实现类提供模块初始化和处置事件。 
     2 IHttpModule包含兩個方法:
     3 
     4 public void Init(HttpApplication context);
     5 public void Dispose();
     6 
     7 Init():这个方法接受一个HttpApplication对象,HttpApplication代表了当前的应用程序,我们需要在这个方法内注册 HttpApplication对象暴露给客户端的事件。可见,这个方法仅仅是用来对事件进行注册,而实际的事件处理程序,需要我们另外写方法。
     8 
     9 整个过程很好理解:
    10 
    11 1.       当站点第一个资源被访问的时候,Asp.Net会创建HttpApplication类的实例,它代表着站点应用程序,同时会创建所有在Web.Config中注册过的Module实例。
    12 2.       在创建Module实例的时候会调用Modul的Init()方法。
    13 3.       在Init()方法内,对想要作出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法需要另写)。
    14 4.       HttpApplication在其应用程序周期中触发各类事件。
    15 5.       触发事件的时候调用Module在其Init()方法中注册过的方法。
    16 
    17 Dispose():它可以在进行垃圾回收之前进行一些清理工作。
    18 
    19 public class ModuleDemo:IHttpModule
    20 {
    21     public void Init(HttpApplication context) {
    22         // 注册HttpApplication应用程序 BeginRequest 事件
    23         // 也可以是其他任何HttpApplication暴露出的事件
    24         context.BeginRequest += new EventHandler(context_BeginRequest);
    25     }
    26 
    27     void context_BeginRequest(object sender, EventArgs e) {
    28         HttpApplication application = (HttpApplication)sender;
    29         HttpContext context = application.Context;
    30         // 做些实际的工作,HttpContext对象都获得了,剩下的基本可以自由发挥了
    31     }
    32 
    33     public void Dispose() {
    34     }
    35 }
    36 
    37 通过Http Module向Http请求输出流中写入文字
    38 
    39 本例中,我们仅用BeginRequest事件和 EndRequest 事件对 Http Module 的使用作以说明。我们通过这个范例,了解 Http Module 基本的使用方法。
    40 
    41 首先,请创建一个新的站点,在App_Code目录中添加类文件: ModuleDemo.cs:
    42 
    43 public class ModuleDemo:IHttpModule
    44 {
    45     // Init方法仅用于给期望的事件注册方法
    46     public void Init(HttpApplication context) {
    47         context.BeginRequest += new EventHandler(context_BeginRequest);
    48         context.EndRequest += new EventHandler(context_EndRequest);
    49     }
    50 
    51     // 处理BeginRequest 事件的实际代码
    52     void context_BeginRequest(object sender, EventArgs e) {
    53         HttpApplication application = (HttpApplication)sender;
    54         HttpContext context = application.Context;
    55         context.Response.Write("<h1 style='color:#00f'>来自HttpModule 的处理,请求到达</h1><hr>");
    56     }
    57 
    58     // 处理EndRequest 事件的实际代码
    59     void context_EndRequest(object sender, EventArgs e) {
    60         HttpApplication application = (HttpApplication)sender;
    61         HttpContext context = application.Context;
    62         context.Response.Write("<hr><h1 style='color:#f00'>来自HttpModule的处理,请求结束</h1>");
    63     }
    64         
    65     public void Dispose() {
    66     }
    67 }
    68 
    69 上面的代码很简单,它注册了 HttpApplication实例的 BeginRequest 事件 和 EndRequest事件,事件处理方法的作用仅仅是在http请求开始和结束的时候,给http请求的输入流中分别写入不同的内容。
    70 
    71 接下来在 Web.config 的 System.web 结点中写入以下内容:
    72 
    73 <system.web>
    74     <httpModules>
    75         <add name="MyModule" type="ModuleDemo" />
    76     </httpModules>
    77 </system.web>
    78 
    79 在这册我们自己的http module 时,假设类名为ModuleDemo,位于myNameSpace命名空间下,程序集名称为myDll,我们只需将myDll.dll拷贝到Bin目录下,并在站点的 web.config 文件 system.web 结点下创建 httpModules 结点:
    80 
    81 <system.web>
    82     <httpModules>
    83         <add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>
    84     </httpModules>
    85 </system.web>
    86 
    87 type属性由分号“,”分为两部分,前面是命名空间及类名,也就是类型名;后面是程序集名。如果我们将代码创建在App_Code目录中,则不需要再指定程序集名。
    88 
    89 name属性由我们自己命名,不一定与类名相同,此处我将它命名为“CustomModuleName”。我们可以通过应用程序(HttpApplication) 的Modules属性获取HttpModuleCollection集合,然后通过name属性,进一步获取HttpModule对象。
    90 
    91 通过name属性,我们还可以在global.asax中文件中编写自定义HttpModule暴露出的事件的处理程序,它采用的格式是:void ModuleName_EventName(object sender, EventArgs e)。
  • 相关阅读:
    看动画学算法之:排序-归并排序
    看动画学算法之:排序-选择排序
    【电脑】第3期:电脑如何打开上帝模式?
    限时删除!能挑战idm的下片神器,最快33M/S
    基本类型计算中浮点数的错误
    字符数组的toString方法打印的是地址值
    boolean类型的成员变量自动生成get方法的问题
    多态的使用
    抽象类和接口的使用关系
    接口的注意事项
  • 原文地址:https://www.cnblogs.com/lihui1030/p/3102622.html
Copyright © 2020-2023  润新知