惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
博客园_首页
S
SegmentFault 最新的问题
H
Help Net Security
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss
量子位
GbyAI
GbyAI
M
MIT News - Artificial intelligence
Recorded Future
Recorded Future
P
Privacy & Cybersecurity Law Blog
B
Blog
月光博客
月光博客
博客园 - 聂微东
Vercel News
Vercel News
罗磊的独立博客
腾讯CDC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
L
Lohrmann on Cybersecurity
I
Intezer
小众软件
小众软件
T
The Exploit Database - CXSecurity.com
Jina AI
Jina AI
C
Check Point Blog
AWS News Blog
AWS News Blog
C
Cisco Blogs
Martin Fowler
Martin Fowler
The Last Watchdog
The Last Watchdog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
宝玉的分享
宝玉的分享
S
Security Affairs
大猫的无限游戏
大猫的无限游戏
N
News and Events Feed by Topic
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Hacker News: Front Page
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
P
Proofpoint News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog

博客园 - Laeb

ASP.NET Web 页面语法概览 ASP.NET Web 页面中的新事物 渐增的许可 介绍 ASP.NET Web 页面 管理工具 ASP.NET Web 页面概览 检测何时需要更改安全策略 安全策略管理的概览 System.Net 类的最佳习惯 异常处理的最佳习惯 面向世界应用程序开发的最佳习惯 使用 ASP.NET 所创建的 XML Web 服务的设计指南 为并发执行而创建应用程序与组件的指南 ASP.NET 控件与可访问 ASP.NET 中的可访问支持 实践:创建自定义 HTTP 模块 实践:创建 HTTP 处理器工厂 实践:注册 HTTP 处理器 实践:创建同步 HTTP 处理器
HTTP 模块介绍
Laeb · 2007-03-19 · via 博客园 - Laeb

HTTP 模块就是在你的应用程序产生每个请求的时候而被调用的汇编集。HTTP 模块通过 ASP.NET 请求管道的一部分而被调用并且能够访问贯穿于请求的生命周期事件。HTTP 模块因此为你提供机会来检查输入请求并且获取基于该请求的动作。它们同样为你提供机会来检查并且更改输出回应。

ASP.NET HTTP 模块与 ISAPI 过滤器的相似之处是它们都是为所有的请求而运行。但是,它们被编写在被管理代码中并且完全被集成在 ASP.NET 应用程序的生命周期中。

HTTP 模块的典型用途包括:

  • 安全。因为你可以检查输入请求,你的 HTTP 模块能够在页面或者 XML Web 服务被请求之前,或者处理器被调用之前完成自定义识别或者其他安全检查。
  • 统计与日志。因为 HTTP 模块在每个请求中都被调用,你可以把请求统计和日志信息收集到一个集中的模块中,胜于在单独的页面中。
  • 自定义页头或者页脚。因为你可以更改输出回应,你可以把内容(比如自定义页头信息)注入进每个页面回应或者 XML Web 服务回应。

ASP.NET 使用模块来实现不同的应用程序特征,包括窗体识别、高速缓存、会话状态,以及客户端脚本服务。在每种情况下,当这些服务被启用的时候,该模块就被作为请求的一部分而被调用并且完成任何单个页面请求范围之外的任务。模块能够消耗应用程序事件也能够引发可以在 Global.asax 文件中被处理的事件。关于应用程序事件的更多信息,请参考[ASP.NET 应用程序生命周期概览]。

提示:HTTP 模块不同于 HTTP 处理器。HTTP 模块为所有请求和回应而被调用,而 HTTP 处理器只运行在特定请求的回应中。关于更多信息,请参考[介绍 HTTP 处理器]。

HTTP 模块如何工作

你需要在应用程序的 Web.config 文件中注册自定义 HTTP 模块。当 ASP.NET 为 HttpApplication 类(用于呈现你的应用程序)创建实例的时候,也会创建任何已注册模块的实例,它的 Init 方法会被调用并且模块初始化它自身。关于更多信息,请参考[ASP.NET 应用程序生命周期概览]。

在模块的 Init 方法中,你可以把事件绑定到在模块中被创建的方法,从而订阅不同的应用程序事件(比如 BeginRequest 或者 EndRequest)。当这些事件被引发的时候,模块中的适当方法就被调用并且模块可以完成任何必需的逻辑,比如一个鉴别检查或者日志请求信息。在事件处理的期间,模块可以访问当前请求的 Context 属性。这允许你把请求重定向到一个可供选择的页面、更改请求,或者完成任何其他请求操作。例如,如果你的模块包括一个鉴别检查,模块可能会检查凭证并且重定向到一个登入页面或者出错页面,如果该凭证是错误的话。否则,当模块的事件处理器已经完成运行,ASP.NET 就会在管道中调用下一个进程,这有可能是另一个模块或者是关于该请求的适当的 HTTP 处理器(比如一个 .aspx 文件)。

HTTP 模块 VS Global.asax 文件

你可以在应用程序的 Global.asax 文件中实现模块的多数功能,从而允许你对应用程序的事件产生回应。但是,模块对比于 Global.asax 文件的一个优势就是它们是被封装的并且只需要创建一次就可以在许多不同的应用程序中被使用。通过把它们添加到 Global Assembly Cache(GAC)并且在 Machine.config 文件中注册,你就可以对它们实现跨应用程序的重用。关于更多信息,请参考[全局汇编缓存]。

但是,使用 Global.asax 文件的优势就是你可以把代码存放到其他已注册的模块事件(比如 Session_Start 和 Session_End 方法)中。另外,Global.asax 文件还允许你例示可用于整个应用程序的全局对象。

只要你需要创建依赖于应用程序事件的代码、并且你想要在其他应用程序中重用模块,或者你不想要在 Global.asax 文件中存放复杂的代码,你就应该使用模块。你应该把代码存放进 Global.asax 文件,只要你需要创建依赖于应用程序事件的代码并且你不需要跨应用程序对它进行重用,或者当你需要订阅在模块中不可用的事件(比如 Session_Start)的时候。

创建 HTTP 模块

你可以创建一个实现了 IHttpModule 接口的类然后把它注册到 Web.config 文件中,从而创建一个自定义 HTTP 模块。编写 HTTP 模块的一般过程是:

  • 创建一个实现了 IHttpModule 的 frlrfSystemWebIHttpModuleClassTopic 接口。
  • 为 InitfrlrfSystemWebIHttpModuleClassInitTopic 方法编写一个处理器。你的 init 方法应该初始化你的模块并且订阅到任何必需的应用程序事件。例如,你可能订阅到 EndRequest 事件,如果你想要在回应中添加什么的话,或者你可能订阅到 AuthenticateRequest 事件,如果你想要完成自定义鉴别逻辑的话。关于应用程序事件的更多信息,请参考[ASP.NET 应用程序生命周期概览]。
  • 为你需要订阅的事件而编写代码。
  • 有选择地实现 Dispose 方法,如果你的模块需要清理的话。
  • 在 Web.config 文件中注册模块。

关于更多信息,请参考[实践:创建自定义 HTTP 模块]。