C# IHttpHandler与IHttpModule

C# IHttpHandler与IHttpModule,c#,asp.net,iis,httphandler,httpmodule,C#,Asp.net,Iis,Httphandler,Httpmodule,我的问题很简单(尽管答案很可能不是):我正试图决定如何在C#/ASP.NET中实现服务器端上传处理程序 我同时使用了HttpModules(IHttpModule接口)和httphandler(IHttpHandler接口),我想我可以使用这两种机制实现它。我也意识到我不理解两者之间的区别 所以我的问题是:在什么情况下我会选择使用IHttpHandler而不是IHttpModule(反之亦然)? 在管道中执行的一个要高得多吗?在某些情况下,是否更易于配置?一个不能很好地使用中等安全性吗?如上所述

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

我同时使用了HttpModules(IHttpModule接口)和httphandler(IHttpHandler接口),我想我可以使用这两种机制实现它。我也意识到我不理解两者之间的区别

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


在管道中执行的一个要高得多吗?在某些情况下,是否更易于配置?一个不能很好地使用中等安全性吗?

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

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


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

模块中设置它来决定使用什么。模块用于处理处理程序实际处理请求前后应用程序引发的事件。另一方面,处理程序没有机会订阅任何应用程序事件,而只是调用它们的ProcessRequest方法来处理特定请求的“主要”工作

请看一下Microsoft提供的文档(在“请求由HttpApplication管道处理”一节中,大约在页面的一半处):

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

根据您试图实现的特定功能,您可以使用处理程序或模块来实现上载处理程序。您甚至可能最终使用这两种方法

可能需要使用已经编写的上传处理程序。

这是一个免费的开源软件:

这是一个商业广告:


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

15秒有一个很好的小示例,它给出了一个很好的示例ASP.NETHTTP处理程序是响应向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服务响应中

From:

如果在HttpModule中显式解析为实现的类,则不需要将处理程序映射到扩展iHttpHandler@rizzle:什么是“显式解析为实现IHttpHandler的类”?你是说IHttpModule也是一个IHttpHandler吗?@Ryan:在该模块中,你可以将一个方法附加到HttpApplication.BeginRequest事件,并将你选择的处理程序赋予它,不管文件扩展名是什么,我都会认真地笑“我也觉得我不明白两者之间的区别。”这是个好问题,但它应该只得到+1:):-)谢谢。我发现对我不知道的事情诚实是很好的。没有问题,就没有答案……)这篇文章现在可以在