IHttpHandler和IHttpModule


81

我的问题很简单(尽管答案很可能不是):我正在尝试决定如何在C#/ ASP.NET中实现服务器端上传处理程序。

我同时使用了HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),但我发现我可以使用任何一种机制来实现它。我还想到我不了解两者之间的区别。

所以我的问题是: 在什么情况下我会选择使用IHttpHandler而不是IHttpModule(反之亦然)?

在流水线中被执行得更高吗?在某些情况下配置起来容易得多吗?中等安全性不能很好地发挥作用吗?


3
认真地大声笑着说:“我也发现我不了解两者之间的区别。” 好问题,但仅应为此设置+1 :)
JohnIdol 2011年

2
:-) 谢谢。我发现对我不知道的东西诚实是很好的。
Dan Esparza

1
没有问题,就没有答案.. :)
Sprintstar

Answers:


70

ASP.NET HTTP处理程序是响应对ASP.NET Web应用程序的请求而运行的过程(通常称为“端点”)。最常见的处理程序是处理.aspx文件的ASP.NET页处理程序。当用户请求.aspx文件时,页面将通过页面处理程序处理该请求。您可以创建自己的HTTP处理程序,以将自定义输出呈现给浏览器。

自定义HTTP处理程序的典型用法包括:

  • RSS提要要为网站创建RSS提要,可以创建一个发出RSS格式XML的处理程序。然后,您可以将文件扩展名(例如.rss)绑定到自定义处理程序。当用户向您的站点发送以.rss结尾的请求时,ASP.NET会调用您的处理程序来处理该请求。
  • 图像服务器如果希望Web应用程序提供各种大小的图像,则可以编写一个自定义处理程序来调整图像的大小,然后将其作为处理程序的响应发送给用户。

一个HTTP模块是呼吁是你的应用的每个请求的组件。HTTP模块被称为ASP.NET请求管道的一部分,并且可以在整个请求中访问生命周期事件。HTTP模块使您可以检查传入和传出的请求,并根据请求采取措施。

HTTP模块的典型用法包括:

  • 安全性因为可以检查传入的请求,所以HTTP模块可以在调用所请求的页面,XML Web服务或处理程序之前执行自定义身份验证或其他安全检查。在以集成模式运行的Internet信息服务(IIS)7.0中,可以将表单身份验证扩展到应用程序中的所有内容类型。
  • 统计信息和日志记录因为在每个请求上都调用HTTP模块,所以您可以在集中式模块中而不是单个页面中收集请求统计信息和日志信息。
  • 定制标头或页脚因为可以修改传出响应,所以可以将诸如定制标头信息之类的内容插入每个页面或XML Web服务响应中。

来自:http : //msdn.microsoft.com/zh-cn/library/bb398986.aspx


16

如前所述这里,的HttpModules是简单的类,可以自己插到请求处理管道,而从HttpHandlers的的HttpModules不仅是因为他们在请求处理管道位置的不同,而且还因为他们必须被映射到一个特定的文件扩展名。


如果您在HttpModule中显式解析为实现iHttpHandler的类,则无需将处理程序映射到扩展名
missaghi

@rizzle:“明确解析为实现IHttpHandler的类”是什么意思?您是说IHttpModule还是IHttpHandler吗?

3
@Ryan:在模块中,您可以将方法附加到HttpApplication.BeginRequest事件,并为它提供您选择的处理程序,而不考虑文件扩展名
missaghi 2010年

15

IHttpModule给您更多的控制权,您基本上可以控制定向到Web应用程序的所有流量。IHttpHandler会给您带来更少的控制权(流量会到达处理程序之前被过滤),但是如果这足以满足您的需求,那么我认为没有理由使用IHttpModule

无论如何,最好将您的自定义逻辑放在单独的类中,然后从IHttpModule或中使用该类IHttpHandler。这样,您就不必真正担心选择其中一个。事实上,你可以创建一个额外的类,它实现 IHttpHandlerIHttpModule,然后再决定通过设置它使用什么Web.config


谢谢,您能解释一下,我们正在向Web服务器添加自定义身份验证,例如远程请求,但不将其用于本地请求吗?
fkl

5

模块旨在处理应用程序在处理程序实际处理请求之前和之后引发的事件。另一方面,处理程序没有机会订阅任何应用程序事件,而是简单地调用它们的ProcessRequest方法,以完成处理特定请求的“主要”工作。

请查看Microsoft提供的该文档(大约在“请求由HttpApplication管道处理”页面的中间):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

您可以在步骤15中看到处理程序获得执​​行的机会。该步骤之前和之后的所有事件都可用于模块拦截,但不能用于处理程序。

根据您要实现的特定功能,可以使用处理程序或模块来实现上传处理程序。您甚至可能会同时使用两者。

需要考虑的事情可能是使用已经编写的上传处理程序。

这是一个免费的开源程序:

http://www.brettle.com/neatupload

这是一个商业广告:

http://krystalware.com/Products/SlickUpload/

如果查看NeatUpload的文档,您会发现它要求您配置模块。


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.