81

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

我已经使用了 HttpModules(IHttpModule 接口)和 HttpHandlers(IHttpHandler 接口),我突然想到我可以使用任何一种机制来实现它。我也想到我不明白两者之间的区别。

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

一个在管道中执行得更高吗?在某些情况下更容易配置吗?在中等安全性下不能很好地工作吗?

4

5 回答 5

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

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

于 2009-09-21T06:41:32.793 回答
16

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

于 2009-04-20T18:11:33.727 回答
15

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

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

于 2009-04-20T18:14:11.663 回答
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 的文档,您会发现它需要您配置一个模块。

于 2009-04-20T18:21:05.717 回答
5

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

于 2009-05-20T05:48:45.517 回答