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



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • NetBPM的安装还是比较简单的,有比较详细的文档。1.当然是先下载运行程序了,netbpm-0.8.3.1.zip,官方网站ÿ ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
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社区 版权所有