热门标签 | 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



推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在IIS上运行的WebApi应用程序在开发环境中能够正常进行文件的读写操作。然而,在尝试通过FTP访问实时服务器上的文件列表时,遇到了无法显示的问题,尽管服务器配置与开发环境相同。这可能涉及权限设置、FTP服务配置或网络连接等方面的问题。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • Sanic 是一个类似于 Flask 的 Python 3.5 Web 服务器,以其出色的写入速度而著称。与 Flask 不同,Sanic 支持异步请求处理,这使得它在处理高并发请求时表现更加出色。通过利用 Python 的异步特性,Sanic 能够显著提高应用程序的性能和响应能力,适用于构建高性能的异步 Web 应用。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 深入解析Django CBV模型的源码运行机制
    本文详细探讨了Django CBV(Class-Based Views)模型的源码运行流程,通过具体的示例代码和详细的解释,帮助读者更好地理解和应用这一强大的功能。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
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社区 版权所有