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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Laeb

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