IHttpHandler与IHttpModule

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

我已经使用HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),我发现我可以使用任何一种机制来实现这一点。 我也觉得我不了解两者的区别。

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

是否有人执行更高的pipe道? 在某些情况下configuration更容易吗? 中等安全性不适合吗?

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

自定义HTTP处理程序的典型用途包括以下内容:

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

一个HTTP模块是一个程序集,每一个请求都会被调用。 HTTP模块作为ASP.NET请求pipe道的一部分被调用,并可以在整个请求中访问生命周期事件。 HTTP模块可以检查传入和传出的请求,并根据请求采取行动。

HTTP模块的典型用途包括:

  • 安全性因为您可以检查传入的请求,所以在调用请求的页面,XML Web服务或处理程序之前,HTTP模块可以执行自定义身份validation或其他安全性检查。 在集成模式下运行的Internet Information Services(IIS)7.0中,可以将表单身份validation扩展到应用程序中的所有内容types。
  • 统计和logging由于每个请求都会调用HTTP模块,因此可以将请求统计信息和日志信息集中在一个集中模块中,而不是单独的页面中。
  • 自定义页眉或页脚由于您可以修改传出响应,因此可以将内容(如自定义页眉信息)插入到每个页面或XML Web服务响应中。

来自: http : //msdn.microsoft.com/en-us/library/bb398986.aspx

如上所述,HttpModules是简单的类,可以将自己插入到请求处理pipe道中,而HttpHandler与HttpModules的不同之处不仅在于它们在请求处理pipe道中的位置,还因为它们必须映射到特定的文件扩展名。

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

无论如何,最好是将自定义逻辑放在一个单独的类中,然后从IHttpModuleIHttpHandler使用这个类。 这样你不必担心select其中一个。 事实上,您可以创build一个额外的类,它实现 IHttpHandlerIHttpModule ,然后通过在Web.config设置它来决定使用什么。

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

看看这个来自微软的文档(大约在“请求由HttpApplicationpipe道处理”一节中的页面的一半):

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

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

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

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

这里有一个免费的开源软件:

http://www.brettle.com/neatupload

这是一个商业的:

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

如果你看看NeatUpload的文档,你会发现它需要你configuration一个模块。

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