IHttpHandler vs IHttpModule

Dan*_*rza 79 c# asp.net iis httphandler httpmodule

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

我已经使用了HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),我发现我可以使用这两种机制来实现它.我也想到,我不明白两者之间的差异.

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

一个人在管道中执行得更高吗?在某些情况下更容易配置吗?一个人不适合中等安全性吗?

小智 69

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/en-us/library/bb398986.aspx


Kir*_*tan 16

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

  • @Ryan:在模块中,您可以将方法附加到HttpApplication.BeginRequest事件,并为其提供您选择的处理程序,而不管文件扩展名如何 (3认同)

Igo*_*ejc 15

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

无论如何,它可能是最好的让你的自定义逻辑在一个单独的类,然后只需使用这个类从任一IHttpModuleIHttpHandler.这样你就不必担心选择其中一个了.事实上,你可以创建一个实现了一个额外的类 IHttpHandlerIHttpModule再决定通过设置它使用什么Web.config.


小智 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的文档,你会发现它需要你配置一个模块.


Yor*_*iev 5

15秒有一个很好的小 教程给出了实际的例子

  • 现在可以在codeguru上找到这篇文章:http://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm (2认同)