热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

理解并自定义HttpModule

前言继上一篇理解并自定义HttpHandler后,有进行了HttpModule的进一步学习

前言                                  

  继上一篇理解并自定义HttpHandler后,有进行了HttpModule的进一步学习,本篇作为一个小结。

  主要参考:Asp.Net 构架(HttpModule 介绍) - Part.3

目录                                  

1.到底什么是HttpModule?

2.系统内部的HttpModule。

3.配置HttpModule。

4.自定义HttpModule。

5.Global.asax文件与HttpModule。

 

到底什么是HttpModule                          

  Asp.net的事件分为三级:应用程序级、页面级和控件级。而HttpModule是通过在管道模型中对Asp.net的应用程序级事件进行订阅,当应用程序级事件触发时调用HttpModule中对应的处理方法。也就是说HttpModule是订阅Asp.net应用程序级事件的入口,依附于HttpApplication对象生命周期的各个事件。

 

系统内部的HttpModule                          

  Asp.net内部很多功能都以HttpModule形式来实行,如Windows、Forms和PassPort认证、Session机制等。下面是部分的内部HttpModule及其作用。

名称类型功能
OutputCacheSystem.Web.Caching.OutputCacheModule页面级输出缓存
SessionSystem.Web.SessionState.SessionStateModuleSession状态管理
WindowsAuthenticationSystem.Web.Security.WindowsAuthenticationModule用集成Windows身份验证进行客户端验证
FormsAuthenticationSystem.Web.Security.FormsAuthenticationModule用基于COOKIE的窗体身份验证进行客户端身份验证
PassportAuthenticationSystem.Web.Security.PassportAuthenticationModule用MS护照进行客户身份验证
RoleManagerSystem.Web.Security.RoleManagerModule管理当前用户角色
UrlAuthorizationSystem.Web.Security.UrlAuthorizationModule判断用户是否被授权访问某一URL
FileAuthorizationSystem.Web.Security.FileAuthorizationModule判断用户是否被授权访问某一资源
AnonymousIdentificationSystem.Web.Security.AnonymousIdentificationModule管理Asp.Net应用程序中的匿名访问
ProfileSystem.Web.Profile.ProfileModule管理用户档案文件的创立 及相关事件
ErrorHandlerModuleSystem.Web.Mobile.ErrorHandlerModule捕捉异常,格式化错误提示字符,传递给客户端程序

 

配置HttpModule                              

  自定义HttpModule跟自定义HttpHandler相似,都要在web.config文件中进行配置。形式如下:

1 <HttpModules>
2 <add name&#61;"MM" type&#61;"MyModule,MMAssembly"/>
3 HttpModules>

1.type&#xff1a;跟HttpHandler中的一样&#xff0c;有两部分组成&#xff0c;第一部分是完整的类名&#xff08;含命名空间名&#xff09;&#xff0c;第二部分是所在程序集名&#xff08;不含.dll&#xff09;。

2.name&#xff1a;HttpModule的名称&#xff0c;可以跟类名无关。通过HttpApplication对象的Modules属性获取HttpModuleCollection&#xff0c;然后通过name获取对应的HttpModule对象&#xff1b;在Global.asax中通过方法名ModuleName_EventName订阅HttpModule中的事件&#xff0c;这里为MM_具体的事件名&#xff0c;详细请见下面实例。

3.因为对于每个进入工作进程的请求都会经过各已配置的HttpModule的处理&#xff08;因为HttpModule是订阅应用程序级事件的&#xff09;&#xff0c;所以配置文件中没有path和verb属性&#xff08;不管是*.aspx还是*.ashx&#xff0c;请求方式为get还是post都会进行处理&#xff09;。

注意&#xff1a;HttpModule的配置是无需像HttpHandler那样在IIS上进行配置的。

 

自定义HttpModule                             

  每个HttpModule都继承System.Web.IHttpModule接口&#xff0c;并实现接口的Init(HttpApplication context)和Dispose()方法。如下&#xff1a;

1 public class MyModule:IHttpModule
2 {
3
4 public void Init(HttpApplication context)
5 {
6 context.BeginRequest &#43;&#61; new EventHandler(context_BeginRequest);
7 }
8
9 void context_BeginRequest(object sender, EventArgs e)
10 {
11 HttpContext.Current.Response.Write("BeginRequest");
12 }
13
14 public void Dispose()
15 {
16 }
17 }

Init()&#xff1a;这个方法接受一个HttpApplication对象&#xff0c;HttpApplication代表了当前的应用程序&#xff0c;我们需要在这个方法内订阅 HttpApplication对象暴露给客户端的事件。可见&#xff0c;这个方法仅仅是用来对事件进行订阅&#xff0c;而实际的事件处理程序&#xff0c;需要我们另外写方法。

Dispose()&#xff1a;在垃圾回收前释放资源。

整个过程很好理解&#xff1a;

  1. 当站点第一个资源被访问的时候&#xff0c;Asp.Net会创建HttpApplication类的实例&#xff0c;它代表着站点应用程序&#xff0c;同时会创建所有在Web.Config中注册过的Module实例。
  2. 在创建Module实例的时候会调用Module的Init()方法。
  3. 在Init()方法内&#xff0c;对想要作出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册&#xff0c;实际的方法需要另写)。
  4. HttpApplication在其应用程序周期中触发各类事件。
  5. 触发事件的时候调用Module在其Init()方法中注册过的方法。

关于委托可参考&#xff1a;委托与事件

 

Global.asax文件与 HttpModule                    

在asp.net中&#xff0c;Glabal不仅可以注册应用程序和Session事件&#xff0c;还可以注册Http Module暴露出的事件&#xff1b;不仅可以注册系统Module的事件&#xff0c;也可以注册我们自己义的Module暴露出的事件。在具体介绍之前&#xff0c;这里需要首先注意两点&#xff1a;

  1. 在每处理一个Http请求时&#xff0c;应用程序事件都会触发一遍&#xff0c;但是Application_Start和 Application_End 例外&#xff0c;它仅在第一个资源文件被访问时被触发。
  2. Http Module无法注册和响应Session事件&#xff0c;对于Session_Start 和 Session_End&#xff0c;只能通过Glabal.asax来处理。

继续上面的例子&#xff1a;

MyModule.cs文件

1 public class MyModule:IHttpModule
2 {
3 public event EventHandler ExposedEvent;//HttpModule事件&#xff0c;供Global.asax来订阅
4
5 public void Init(HttpApplication context)
6 {
7 context.BeginRequest &#43;&#61; new EventHandler(context_BeginRequest);//订阅HttpApplication的事件
8 }
9
10 void context_BeginRequest(object sender, EventArgs e)
11 {
12 HttpContext.Current.Response.Write("BeginRequest");
13 OnExposedEvent(new EventArgs());//触发HttpModule自定义事件
14 }
15
16 protected void OnExposedEvent(EventArgs e)
17 {
18 if (ExposedEvent !&#61; null)
19 {
20 ExposedEvent(this, e);
21 }
22 }
23
24 public void Dispose()
25 {
26 }
27 }

Global.asax文件

1 void MyModule_ExposedEvent(object sender, EventArgs e)
2 {
3 Response.Write("xixi");
4 }

上面的MyModule_ExposedEvent方法就会自动订阅了MyModule中的ExposedEvent事件。具体实现机制有待研究&#xff01;

转:https://www.cnblogs.com/fsjohnhuang/archive/2012/02/06/2339647.html



推荐阅读
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统上安装中文宋体字体的方法,包括操作系统的环境配置、字体管理工具的安装、字体文件的传输与缓存重建等步骤。 ... [详细]
  • 使用REM和媒体查询实现响应式布局
    本文介绍如何利用REM单位和媒体查询(Media Queries)来创建适应不同屏幕尺寸的网页布局。通过具体示例,展示在不同屏幕宽度下如何调整页面元素的样式。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 在测试软件或进行系统维护时,有时会遇到电脑蓝屏的情况,即便使用了沙盒环境也无法完全避免。本文将详细介绍常见的蓝屏错误代码及其解决方案,帮助用户快速定位并解决问题。 ... [详细]
author-avatar
唤起
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有