2009-04-20 21 views
76

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

我已经使用HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),它发生在我身上,我可以使用任何一种机制来实现这一点。我不明白这两者之间的差异,我也会想到。

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

是在管线中执行高得多?在某些情况下配置更容易吗?中等安全性不适合吗?

+2

在认真LOL'ed“它也发生,我认为我不明白两者之间的差异。”好问题,但它应该只为+1 :) – JohnIdol 2011-03-10 14:26:26

+2

:-)谢谢。对于我不认识的东西,我认为诚实是件好事。 – 2011-03-10 18:51:51

+1

没有问题,就没有答案..:) – Sprintstar 2011-07-13 10:31:51

回答

65

的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 Information Services(IIS)7.0中,可以将表单身份验证扩展到应用程序中的所有内容类型。
  • 统计和记录由于HTTP模块被称为在每次请求,您可以收集请求统计和集中模块中的日志信息,而不是单个页面。
  • 自定义页眉或页脚,因为你可以修改传出响应,你可以插入内容,如自定义页眉信息到每一个网页或XML Web服务响应。

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

16

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

+0

如果在HttpModule中显式解析为实现iHttpHandler的类,则不需要将处理程序映射到扩展插件 – rizzle 2009-04-20 20:14:54

13

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

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

5

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

看看微软本文档(大约一半倒在页面节“的请求是由一个HttpApplication管线处理”):

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

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

取决于你想实现什么具体的功能,你可以使用一个处理程序或模块来实现的上传处理程序。你甚至可能会同时使用两者。

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

这里是一个自由和开放源码的一个:

http://www.brettle.com/neatupload

这里有一个商业项目之一:

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

如果你看一下NeatUpload的文件,你会看到它要求您配置一个模块。

5

15秒有一个很好的小tutorial给出实际例子