【问题标题】:HTTP handler vs HTTP moduleHTTP 处理程序与 HTTP 模块
【发布时间】:2011-09-20 21:43:01
【问题描述】:

有人能用不到 2 句话解释两者之间的区别吗?是的,我知道谷歌可以提供数百个答案,但不能提供二分之一的清晰句子:)

【问题讨论】:

  • 在每个请求之前运行一些代码的上下文中。
  • +1 表示“是的,我知道我可以谷歌搜索”。
  • “不到两句话。”比如,一句话?

标签: asp.net httphandler httpmodule


【解决方案1】:

HTTP 处理程序

HTTP Handler 是响应 HTTP 请求而运行的进程。因此,每当用户请求文件时,处理程序都会根据扩展名对其进行处理。因此,当您需要基于文件扩展名进行特殊处理时,会创建自定义 http 处理程序。让我们考虑一个为站点创建 RSS 的示例。因此,创建一个生成 RSS 格式的 XML 的处理程序。现在将 .rss 扩展名绑定到自定义处理程序。

HTTP 模块

HTTP 模块被插入到请求的生命周期中。因此,当处理请求时,它会通过请求管道中的所有模块。所以一般http模块用于:

安全性:用于在处理请求之前对请求进行身份验证。

统计和日志记录:由于每个请求都会调用模块,因此它们可用于收集统计数据和记录信息。

自定义标头:由于可以修改响应,因此可以在响应中添加自定义标头信息。

【讨论】:

    【解决方案2】:

    HttpHandler 负责处理扩展的 http 请求,同时 HttpModule 响应应用程序生命周期事件。

    【讨论】:

      【解决方案3】:

      HttpHandler 和 HttpModule 的主要和共同目标是在 ASP.NET 请求到达 IIS 服务器之前注入预处理逻辑。

      ASP.NET 提供了两种在请求管道中注入逻辑的方法;

      1. Http 处理程序: Http Handler 帮助我们根据请求的文件名的扩展名注入预处理逻辑。 ASP.NET 使用 HTTP 处理程序来实现许多自己的功能。例如,ASP.NET 使用处理程序来处理 .aspx、.asmx 和 trace.axd 文件。

      示例: RSS 提要:要为网站创建 RSS 提要,您可以创建一个发出 RSS 格式的 XML 的处理程序。因此,当用户向您的站点发送以 .rss 结尾的请求时,ASP.NET 会调用您的处理程序来处理该请求。

      创建 Handler 涉及三个步骤 1.实现IHttpHandler接口。 2. 在 web.config 或 machine.config 文件中注册处理程序。 3. 将文件扩展名(*.arshad)映射到 IIS 中的 aspnet_isapi.dll。

      IHttpHandler 接口有 ProcessRequest 方法和 IsReusable 属性,需要实现。 ProcessRequest:在此方法中,您编写为处理程序生成输出的代码。 IsResuable:这个属性告诉我们这个处理程序是否可以被重用。

      您可以像这样在 web.config 文件中注册处理程序

      <httpHandlers>
         <add verb="*" path="*.arshad" type="namespace.classname, assemblyname" />
      </httpHandlers>
      

      注意:这里我们处理的是任何带有扩展名的文件名。

      1. Http 模块: HttpModule 是一个基于事件的处理器,用于在请求到达 IIS 服务器之前注入预处理逻辑。 ASP.NET 使用 HTTP 模块来实现许多自己的功能,如身份验证和授权、会话管理和输出缓存等。

      当请求通过请求管道时,ASP.NET 引擎会发出大量事件。 其中一些事件是AuthenticateRequest、AuthorizeRequest、BeginRequest、EndRequest。 通过使用 HttpModule,您可以在这些事件中编写逻辑。这些逻辑在事件触发时和请求到达 IIS 之前执行。

      创建模块涉及两个步骤, 1.实现IHttpModule接口 2. 在 web.config 或 machine.config 文件中注册模块

      示例: 安全性:使用 HTTP 模块,您可以在请求到达 IIS 之前执行自定义身份验证或其他安全检查。

      【讨论】:

        【解决方案4】:

        关于它的好文章HttpModule-and-HttpHandlers

        参考:INFO:ASP.NET HTTP 模块和 HTTP 处理程序概述

        “在处理程序执行之前和之后调用模块。模块使开发人员能够拦截、参与或修改每个单独的请求。处理程序用于处理单个端点请求。处理程序使 ASP.NET 框架能够处理应用程序中的单个 HTTP URL 或 URL 扩展组。与模块不同,只有一个处理程序用于处理请求”。

        【讨论】:

        • 谢谢,对我帮助很大
        【解决方案5】:

        两句话:

        一个 HttpModule 将为您的应用程序的每个请求执行,无论扩展如何,通常用于安全、统计、日志记录等。

        HttpHandler 通常与特定的扩展相关联,用于 RSS 提要、动态图像生成或修改等。

        如果不完全清楚,请再解释一下:

        我对它们的看法 - 模块“插入”到请求管道,而处理程序“处理”特定的文件扩展名。因此,如果您有一个包含 LoggingModule 和 PdfHandler 的站点,则两者都会执行对http://example.com/sample.pdf 的请求,而日志模块将单独执行对http://example.com/page.aspx 的请求。

        在 MSDN 上有一篇非常清楚的文章关于区别:HTTP Handlers and HTTP Modules Overview

        【讨论】:

        • 好的,所以如果我想运行一些在对 .aspx 文件的每个请求上运行的代码,我会实现一个处理程序,并且如果我想在每个请求上运行一些代码,而不管请求的文件类型如何我实现了一个模块。是这样吗?
        • @frenchie - 不,aspx 页面建立在 HttpHandlers 之上,为您提供页面生命周期。把它想象成一个 aspx 页面,减少到非常基本的事件。 ProcessRequest。另一方面,模块将在您连接到的生命周期中的任何时间点执行。对于您想要在 aspx 页面之前运行某些内容的场景,您需要一个模块。但是,您需要手动过滤掉对非 .aspx 页面的请求
        • 我是否正确地说每个请求只能有 1 个处理程序和多个模块?
        • 是 handlers = state 的一般答案,模块不是不成文的标准,或者两者有什么根本不同,我的意思是,一个人可以将模块编码成一个处理程序,并且反之亦然,或者它们是否存在限制使其无法实现?
        【解决方案6】:

        HTTP 处理程序是根据设置进行实际编译的地方。例如,如果页面扩展名是 .aspx,那么它将通过 system.web.Ui.Pagahandlefactory 进行编译。在 HTTP 处理请求完成编译后,将通过 HTTP 模块和 IIS。

        【讨论】:

          【解决方案7】:

          HTTP 处理程序是响应对 ASP.NET Web 应用程序发出的请求而运行的进程。 HTTP 模块可让您检查传入和传出请求并根据请求采取行动。

          【讨论】:

          • 从这个意义上说,一个aspx可以被认为是一种httphandler?
          • Yes Frenchie..打开任何aspx后面的代码。您将看到: public partial class good : System.Web.UI.Page 现在右键单击 Page 并单击 Go to definition,您将看到: public class Page : TemplateControl, IHttpHandler
          【解决方案8】:

          HttpHandler 是请求火车的目的地。 HttpModule 是一路上的一站。

          【讨论】:

          • 精彩的解释! :)
          • 简直太棒了!! :)
          • 技术上,不是“少于两句话”。
          • 不错。我要补充一点,HttpContext 是火车。每个站(模块)在经过时都会以某种方式为 HttpContext 做出贡献。
          • 这是一个非常出色的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-26
          • 2010-10-07
          相关资源
          最近更新 更多