HTTP处理程序与HTTP模块


144

有人可以用少于两句话解释两者之间的区别吗?是的,我知道google可以提供数百个答案,但不是每2个清晰句子中的一个:)


在寻找在每个请求之前运行一些代码的情况下。
frenchie 2011年

23
+1表示“是的,我知道我可以使用Google了”。
Csharp

7
“少于两个句子。” 就像一个句子?
安德鲁·塞肯

Answers:


316

HttpHandler是请求序列的前进方向。HttpModule是整个过程中的一个站。


精彩的解释!:)
SO用户

3
我同意这是一个好答案,但是不能标记为已接受答案。
Shrivallabh 2015年

简直太棒了!! :)
Dee

4
从技术上讲,不要少于两个句子。<trollface>
Andrew Theken 2015年

5
真好 我会补充说HttpContext是火车。每个站点(模块)经过时都会以某种方式对HttpContext作出贡献。
杜安(Duanne)2013年

203

两个句子:

HttpModule将针对您的应用程序的每个请求执行,无论其扩展名如何,并且通常用于安全性,统计信息,日志记录等。

HttpHandler通常与特定的扩展名相关联,并且用于RSS提要,动态图像生成或修改等操作。

如果还不清楚,请多做一些解释:

我考虑它们的方式-模块“插入”请求管道,而处理程序“处理”特定文件扩展名。因此,如果您拥有一个包含LoggingModule和PdfHandler的站点,则两者都将执行对http://example.com/sample.pdf的请求,而单独的日志记录模块将执行对http://的请求。example.com/page.aspx

关于MSDN的区别,有一篇非常清晰的文章:HTTP处理程序和HTTP模块概述


1
好的,因此,如果我想运行对.aspx文件的每个请求都运行的代码,则实现一个处理程序;如果我想对每个请求运行一些代码,而与所请求文件的类型无关,则实现一个模块。是吗
frenchie 2011年

5
@frenchie-不,通过为您提供页面生命周期,aspx页面是基于HttpHandlers构建的。可以将其视为一个aspx页面,切入最基本的事件。ProcessRequest。另一方面,该模块将在您将其连接到的生命周期中的任何时候执行。对于要在aspx页面之前运行某些内容的场景,您需要一个模块。但是,您需要手动过滤出对非.aspx页面的请求
-Phill

6
我是否正确地说每个请求只能有一个处理程序和多个模块?
Maarten Kieft 2013年

1
是处理程序=状态的一般答案,而模块不是未成文的标准,还是两者之间有根本不同,我的意思是,一个人可以将模块编码为类似于处理程序,反之亦然吗?他们使不可能?
Rich Bianco

21

HttpHandler和HttpModule的主要共同目标是在ASP.NET请求到达IIS服务器之前注入预处理逻辑。

ASP.NET提供了两种在请求管道中注入逻辑的方法:

  1. Http处理程序:Http处理程序可帮助我们根据所请求文件名的扩展名注入预处理逻辑。ASP.NET使用HTTP处理程序来实现其许多功能,例如,ASP.NET使用处理程序来处理.aspx,.asmx和trace.axd文件。

示例:RSS提要:要为网站创建RSS提要,您可以创建一个发出RSS格式XML的处理程序。因此,当用户向以.rss结尾的网站发送请求时,ASP.NET会调用您的处理程序来处理该请求。

创建处理程序1涉及三个步骤。实现IHttpHandler接口。2.在web.config或machine.config文件中注册处理程序。3.将文件扩展名(* .arshad)映射到IIS中的aspnet_isapi.dll。

IHttpHandler接口具有ProcessRequest方法和IsReusable属性,需要实现。ProcessRequest:在此方法中,您编写用于生成处理程序输出的代码。IsResuable:此属性告诉此处理程序是否可以重用。

您可以像这样在web.config文件中注册处理程序

<httpHandlers>
   <add verb="*" path="*.arshad" type="namespace.classname, assemblyname" />
</httpHandlers>

注意:在这里,我们将处理扩展名为arshad的任何文件名。

  1. Http模块:HttpModule是基于事件的处理器,可以在请求到达IIS服务器之前注入预处理逻辑。ASP.NET使用HTTP模块来实现其自身的许多功能,例如身份验证和授权,会话管理和输出缓存等。

当请求通过请求管道传递时,ASP.NET引擎会发出很多事件。这些事件中的一些是AuthenticateRequest,AuthorizeRequest,BeginRequest,EndRequest。通过使用HttpModule,您可以在这些事件中编写逻辑。这些逻辑在事件触发时以及请求到达IIS之前执行。

创建模块涉及两个步骤,1.实现IHttpModule接口2.在web.config或machine.config文件中注册模块

示例:安全性:使用HTTP模块,可以在请求到达IIS之前执行自定义身份验证或其他安全检查。


19

HTTP处理程序是响应ASP.NET Web应用程序的请求而运行的过程。HTTP模块使您可以检查传入和传出的请求,并根据请求采取措施。


1
从这个意义上讲,aspx可以视为一种httphandler吗?
Frenchie 2011年

17
是的Frenchie ..打开任何aspx后面的代码。您将看到:公共部分类良好:System.Web.UI.Page现在,右键单击Page并单击“转到”定义,您将看到:公共类页面:TemplateControl,IHttpHandler
Aditya Bokade 2012年

5

当HttpModule响应应用程序生命周期事件时,HttpHandler负责按扩展名处理http请求。


2

关于它的不错的文章HttpModule-and-HttpHandlers

参考:INFO:ASP.NET HTTP模块和HTTP处理程序概述

“在处理程序执行之前和之后调用模块。模块使开发人员可以拦截,参与或修改每个单独的请求。处理程序用于处理各个端点请求。处理程序使ASP.NET Framework可以处理应用程序中的各个HTTP URL或一组URL扩展。与模块不同,仅使用一个处理程序来处理请求”。


谢谢您,它对我有很大帮助
Rahul Chowdhury

1

HTTP处理程序是根据设置实际完成编译的地方。例如页面扩展名为.aspx,则它将通过system.web.Ui.Pagahandlefactory进行编译。一旦在HTTP处理完成编译,句柄请求将通过HTTP模块和IIS。


0

HTTP处理程序

HTTP处理程序是响应HTTP请求而运行的过程。因此,无论何时用户请求文件,处理程序都会基于扩展名对其进行处理。因此,当您需要基于文件扩展名进行特殊处理时,会创建自定义http处理程序。让我们考虑为站点创建RSS的示例。因此,创建一个生成RSS格式XML的处理程序。现在,将.rss扩展名绑定到自定义处理程序。

HTTP模块

HTTP模块已插入请求的生命周期。因此,在处理请求时,它会通过请求管道中的所有模块传递。因此,通常http模块用于:

安全性:用于在处理请求之前对请求进行身份验证。

统计信息和日志记录:由于模块是为每个请求调用的,因此它们可用于收集统计信息和记录信息。

自定义标头:由于可以修改响应,因此可以将自定义标头信息添加到响应中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.