如何:注册 HTTP 处理程序

14 篇文章 0 订阅
8 篇文章 0 订阅

创建自定义 HTTP 处理程序类后,必须在 Web.config 文件中注册该类。这将允许 ASP.NET 调用 HTTP 处理程序,以便处理对具有指定文件扩展名的资源的请求。

您注册 HTTP 处理程序的方式取决于您应用程序的宿主 Internet 信息服务 (IIS) 的版本。对于 IIS 6.0,您可以使用 Web.config 文件的 httpHandlers 节注册处理程序。 对于在传统模式下运行的 IIS 7.0,可以在httpHandlers 节中注册处理程序,并将该处理程序映射到 Aspnet_isapi.dll 文件。对于在集成模式下运行的 IIS 7.0,可以使用 system.WebServer 节中的handlers 元素注册处理程序。

注册 HTTP 处理程序 (IIS 6.0)

  1. 编译 HTTP 处理程序类并将结果程序集复制到应用程序根文件夹下的 Bin 文件夹。

    - 或 -

    将处理程序的源代码放入应用程序的 App_Code 文件夹中。

    有关 HTTP 处理程序的示例,请参见演练:创建同步 HTTP 处理程序

  2. 在应用程序的 Web.config 文件中,创建一个 httpHandlers 节。

    下面的示例演示如何注册对 SampleHandler.new 资源的请求进行响应的 HTTP 处理程序。该处理程序定义为程序集 SampleHandlerAssembly 中的类SampleHandler

    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="SampleHandler.new" 
            type="SampleHandler, SampleHandlerAssembly" />
        </httpHandlers>
      </system.web>
    </configuration>
    

    下面的示例将所有对具有文件扩展名“.SampleFileExtension”的文件的 HTTP 请求映射到SampleHandler2 类。 在本例中,处理程序代码位于 App_Code 文件夹中,因此您无需指定程序集。

    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="*.SampleFileExtension" 
             type="SampleHandler2 " />
        </httpHandlers>
      </system.web>
    </configuration>
    
  3. 配置 IIS 以将对具有自定义文件扩展名的文件请求转发到 ASP.NET。

    有关更多信息,请参见如何:在 IIS 中配置 HTTP 处理程序扩展名

注册 HTTP 处理程序(在传统模式下运行的 IIS 7.0)

  1. 编译 HTTP 处理程序类并将结果程序集复制到应用程序根文件夹下的 Bin 文件夹。

    - 或 -

    将处理程序的源代码放入应用程序的 App_Code 文件夹中。

    有关 HTTP 处理程序的示例,请参见演练:创建同步 HTTP 处理程序

  2. 在应用程序的 Web.config 文件中,创建一个 httpHandlers 节。

  3. configuration 元素的内部创建一个 system.webServer 节。

  4. system.WebServer 节的内部创建一个handlers 元素。

    注意注意

    必须定义 httpHandlers 元素和 handlers 元素。

    下面的示例演示如何注册对 SampleHandler.new 资源的请求进行响应的 HTTP 处理程序。该处理程序定义为程序集 SampleHandlerAssembly 中的类SampleHandler

    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="SampleHandler.new" 
            type="SampleHandler, SampleHandlerAssembly" />
        </httpHandlers>
      </system.web>
      <system.webServer>
        <add name=SampleHandler" verb="*" path="SampleHandler.new" 
          Modules="IsapiModule" 
          scriptProcessor="FrameworkPath\aspnet_isapi.dll"
          resourceType="File" />
      </system.webServer>
    </configuration>
    

    FrameworkPath 替换为 Aspnet_isapi.dll 文件的正确路径。

    下面的示例将所有对具有文件扩展名“.SampleFileExtension”的文件的 HTTP 请求映射到SampleHandler2 类。 在本例中,处理程序代码位于 App_Code 文件夹中,因此您无需指定程序集。

    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="*.SampleFileExtension" 
             type="SampleHandler2" />
        </httpHandlers>
      <system.web>
      <system.webServer>
        <add name=SampleHandler2" verb="*" path="*.SampleFileExtension" 
          Modules="IsapiModule" 
          scriptProcessor="FrameworkPath\aspnet_isapi.dll"
          resourceType="File" />
      </system.webServer>
    </configuration>
    

    FrameworkPath 替换为 Aspnet_isapi.dll 文件的正确路径。

    注意注意

    对于在传统模式下运行的 IIS 7.0,无需像对 IIS 6.0 那样单独使用 IIS 管理器将文件扩展名映射到 Aspnet_isapi.dll 文件。可以在 Web.config 文件中映射扩展名。

注册 HTTP 处理程序(在集成模式下运行的 IIS 7.0)

  1. 编译 HTTP 处理程序类并将结果程序集复制到应用程序根文件夹下的 Bin 文件夹。

    - 或 -

    将处理程序的源代码放入应用程序的 App_Code 文件夹中。

    有关 HTTP 处理程序的示例,请参见演练:创建同步 HTTP 处理程序

  2. 在应用程序的 Web.config 文件中,在 system.webServer 节中创建一个handlers 元素。

    注意注意

    不使用在 httpHandlers 元素中定义的处理程序。 如果没有移除 httpHandlers 注册,则必须将 validation 元素的 validateIntegratedModeConfiguration 特性设置为 false,以避免发生错误。 validation 元素是 system.webServer 元素的子元素。有关更多信息,请参见 ASP.NET Integration with IIS 7.0(将 ASP.NET 与 IIS 7.0 集成)中的“Disabling the migration error message”(禁用迁移错误消息)。

    下面的示例演示如何注册对 SampleHandler.new 资源的请求进行响应的 HTTP 处理程序。该处理程序定义为程序集 SampleHandlerAssembly 中的类SampleHandler

    <configuration>
      <system.webServer>
        <handlers>
          <add name="SampleHandler" verb="*" 
            path="SampleHandler.new" 
            type="SampleHandler, SampleHandlerAssembly" 
            resourceType="Unspecified" />
        </handlers>
      </system.webServer>
    </configuration>
    
    注意注意

    resourceType特性执行与 IIS 6.0 的 IIS 管理器中的“验证文件是否存在”选项相同的功能。

    下面的示例演示如何将对具有文件扩展名“SampleFileExtension”的文件的所有 HTTP 请求映射到SampleHandler2 HTTP 处理程序类。 在本例中,处理程序代码位于 App_Code 文件夹中,因此您无需指定程序集。

    <configuration>
      <system.webServer>
        <handlers>
          <add name="SampleHandler2" verb="*"
            path="*.SampleFileExtension" 
            type="SampleHandler2" />
            resourceType="Unspecified" />
        <handlers>
      </system.webServer>
    </configuration>
    

    对于在集成模式下运行的 IIS 7.0,只需要在 handlers 元素中进行注册。

    有关 IIS web.webServer 配置元素的更多信息,请参见 MSDN 网站上的system.webServer Section Group (IIS Settings Schema)(system.webServer 节组(IIS 设置架构))。

    有关如何配置具有自定义文件扩展名的处理程序的更多信息,请参见如何:在 IIS 中配置 HTTP 处理程序扩展名


    本演练阐释如何创建异步 HTTP 处理程序。 使用异步 HTTP 处理程序,您可以在启动一个外部进程(如对远程服务器的方法调用)的同时继续执行该处理程序。 该处理程序可以继续运行,而不必等待外部进程完成。

    在异步 HTTP 处理程序的处理过程中,ASP.NET 将通常用于外部进程的线程放回线程池中,直到处理程序接收到来自外部进程的回调。 由于只能同时执行有限数量的线程,因此这样可以避免阻止线程并改善性能。 如果许多用户都在请求依赖于外部进程的同步 HTTP 处理程序,那么操作系统可能很快就会用完所有线程,因为大量线程被阻止,正在等待外部进程。

    本演练中的示例演示了一个异步 HTTP 处理程序,该处理程序在 ASP.NET 应用程序中处理对文件扩展名为 .SampleAsync 的文件的请求。 该示例显示该处理程序的代码,然后演示如何在 ASP.NET 中将 .SampleAsync 扩展名映射到该处理程序。 该示例还演示如何在 IIS 中将 .SampleAsync 扩展名映射到 ASP.NET,以便 IIS 将以 .SampleAsync 结尾的请求转发到 ASP.NET。

    有关 ASP.NET 运行时如何与 IIS 6.0 交互的更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 有关 ASP.NET 与 IIS 7.0 集成的更多信息,请参见 IIS 7.0 的 ASP.NET 应用程序生命周期概述

    本演练演示以下任务:

    • 如何创建 HTTP 处理程序类的代码。 该类必须实现 ProcessRequest 方法和 IsReusable 属性。

    • 如何在 Web.config 文件中注册处理程序并将 .SampleAsync 文件扩展名映射到该处理程序。

    • 如何在 IIS 中将 .sample 文件扩展名映射到 ASP.NET。

    若要完成本演练,您需要:

    • Visual Studio或 Visual Web Developer。

    • 可以使用 IIS 运行的 ASP.NET 网站。

    • IIS 6.0 或 IIS 7.0。

    首先,将创建一个实现异步处理程序的类。

    创建 HelloWorldAsyncHandler HTTP 处理程序类

    1. 如果要使用的网站还没有 App_Code 文件夹,请在该站点的根目录下创建这样一个文件夹。

    2. 在 App_Code 目录中,创建一个名为 HelloWorldAsyncHandler 的类,并将下面的代码添加到类文件中:

      VB
      Imports Microsoft.VisualBasic
      Imports System.Web
      Imports System.Threading
      
      Public Class HelloWorldAsyncHandler
          Implements IHttpAsyncHandler
      
          Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
              Get
                  Return False
              End Get
          End Property
      
          Public Function BeginProcessRequest( _
              ByVal context As System.Web.HttpContext, _
              ByVal cb As System.AsyncCallback, _
              ByVal extraData As Object) _
              As System.IAsyncResult _
              Implements System.Web.IHttpAsyncHandler.BeginProcessRequest
              context.Response.Write("<p>Begin IsThreadPoolThread is " _
                  & Thread.CurrentThread.IsThreadPoolThread & "</p>" & vbCrLf)
              Dim asynch As New AsynchOperation(cb, context, extraData)
              asynch.StartAsyncWork()
              Return asynch
          End Function
      
          Public Sub EndProcessRequest(ByVal result As _
               System.IAsyncResult) _
               Implements System.Web.IHttpAsyncHandler.EndProcessRequest
          End Sub
      
          Public Sub ProcessRequest(ByVal context _
                  As System.Web.HttpContext) _
                  Implements System.Web.IHttpHandler.ProcessRequest
              Throw New InvalidOperationException()
          End Sub
      End Class
      
      Class AsynchOperation
          Implements IAsyncResult
          Private _completed As Boolean
          Private _state As [Object]
          Private _callback As AsyncCallback
          Private _context As HttpContext
      
          ReadOnly Property IsCompleted() As Boolean _
                  Implements IAsyncResult.IsCompleted
              Get
                  Return _completed
              End Get
          End Property
      
          ReadOnly Property AsyncWaitHandle() As WaitHandle _
                  Implements IAsyncResult.AsyncWaitHandle
              Get
                  Return Nothing
              End Get
          End Property
      
          ReadOnly Property AsyncState() As [Object] _
                  Implements IAsyncResult.AsyncState
              Get
                  Return _state
              End Get
          End Property
      
          ReadOnly Property CompletedSynchronously() As Boolean _
                  Implements IAsyncResult.CompletedSynchronously
              Get
                  Return False
              End Get
          End Property
      
          Public Sub New(ByVal callback As AsyncCallback, _
                  ByVal context As HttpContext, _
                  ByVal state As [Object])
              _callback = callback
              _context = context
              _state = state
              _completed = False
          End Sub
      
          Public Sub StartAsyncWork()
              ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf StartAsyncTask), Nothing)
      
          End Sub
      
          Private Sub StartAsyncTask(ByVal workItemState As [Object])
              _context.Response.Write("<p>Completion IsThreadPoolThread is " & Thread.CurrentThread.IsThreadPoolThread & "</p>" & vbCrLf)
      
              _context.Response.Write("Hello World from Async Handler!")
              _completed = True
              _callback(Me)
      
          End Sub 'StartAsyncTask
      End Class 'AsynchOperation
      

      C#
      using System;
      using System.Web;
      using System.Threading;
      
      class HelloWorldAsyncHandler : IHttpAsyncHandler
      {
          public bool IsReusable { get { return false; } }
      
          public HelloWorldAsyncHandler()
          {
          }
          public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
          {
              context.Response.Write("<p>Begin IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");
              AsynchOperation asynch = new AsynchOperation(cb, context, extraData);
              asynch.StartAsyncWork();
              return asynch;
          }
      
          public void EndProcessRequest(IAsyncResult result)
          {
          }
      
          public void ProcessRequest(HttpContext context)
          {
              throw new InvalidOperationException();
          }
      }
      
      class AsynchOperation : IAsyncResult
      {
          private bool _completed;
          private Object _state;
          private AsyncCallback _callback;
          private HttpContext _context;
      
          bool IAsyncResult.IsCompleted { get { return _completed; } }
          WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
          Object IAsyncResult.AsyncState { get { return _state; } }
          bool IAsyncResult.CompletedSynchronously { get { return false; } }
      
          public AsynchOperation(AsyncCallback callback, HttpContext context, Object state)
          {
              _callback = callback;
              _context = context;
              _state = state;
              _completed = false;
          }
      
          public void StartAsyncWork()
          {
              ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);
          }
      
          private void StartAsyncTask(Object workItemState)
          {
      
              _context.Response.Write("<p>Completion IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");
      
              _context.Response.Write("Hello World from Async Handler!");
              _completed = true;
              _callback(this);
          }
      }
      

      该代码实现 BeginProcessRequest 方法。 该方法向当前的 HttpContext 对象的 Response 属性中写入一个字符串,创建一个 AsyncOperation 类的新实例,然后调用 StartAsyncWork 方法。 然后,StartAsyncWork 方法向 ThreadPool 对象添加 StartAsyncTask 委托。 当有线程可用时,会调用 StartAsyncTask 方法,该方法将另外一个字符串写出到 Response 属性。 然后通过调用 AsyncCallback 委托,完成该任务。

    创建完自定义 HTTP 处理程序类后,必须在应用程序的 Web.config 文件中注册它。 这样,ASP.NET 在收到对 URL 以 .SampleAsync 结尾的资源的请求时,可以找到该处理程序。

    注册处理程序的过程会有所不同,取决于使用的是 IIS 6.0 还是 IIS 7.0。 本节介绍如何在 IIS 6.0 中注册处理程序。 下一节介绍如何在 IIS 7.0 中注册处理程序。

    在 IIS 6.0 中注册处理程序

    1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

    2. 将下面突出显示的标记添加到该 Web.config 文件中:

      <configuration>
        <system.web>
          <httpHandlers>
            <add verb="*" path="*.SampleAsync" 
              type="HelloWorldAsyncHandler"/>
          </httpHandlers>
        </system.web>
      </configuration>
      

      配置元素将 HelloWorldAsyncHandler 处理程序注册为对以 .SampleAsync 结尾的请求的处理程序。

    3. 使用 IIS 管理器为 .SampleAsync 文件扩展名注册一个应用程序扩展名映射。 有关更多信息,请参见如何:在 IIS 中配置 HTTP 处理程序扩展名

    在 IIS 7.0 中,应用程序可以在经典模式或集成模式下运行。 在经典模式下,请求的处理方式与在 IIS 6.0 中大致相同。 在集成模式下,IIS 7.0 使用管道(管道使其可以与 ASP.NET 共享请求、模块和其他功能)来管理请求。

    对于 IIS 7.0,处理程序注册需要在 Web.config 文件或 IIS 管理器中注册处理程序。 因为在 IIS 7.0 中进行集中管理,所以应用程序的 Web.config 文件中的更改会在该应用程序的 IIS 管理器接口中反映出来,反之亦然。 在后面的过程中,处理程序是在 Web.config 文件中注册的。

    对于在经典模式和集成模式下运行的 IIS 7.0,注册处理程序的过程是不相同的。 请根据您要使用的 IIS 模式执行相应的过程。

    在运行于经典模式下的 IIS 7.0 中注册处理程序

    1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

    2. 将下面突出显示的元素添加到 Web.config 文件中。

      注意 注意

      为 aspnet_isapi.dll 文件替换正确的路径。 该 .dll 文件位于安装 .NET Framework 的文件夹中。 默认情况下,此文件夹为 C:\WINDOWS\Microsoft.NET\Framework\版本

      <configuration>
        <system.web>
          <httpHandlers>
            <add verb="*" path="*.SampleAsync" 
              type="HelloWorldAsyncHandler"/>
          </httpHandlers>
        </system.web>
        <system.webServer>
          <handlers>
            <add  verb="*" path="*.SampleAsync"
              name="HelloWorldAsyncHandler"
              type="HelloWorldAsyncHandler"
              modules="IsapiModule"/>
              scriptProcessor="%path%\aspnet_isapi.dll"
          </handlers>
        </system.webServer>
      </configuration>
      

      配置元素按类名注册自定义处理程序,并将 .SampleAsync 文件扩展名映射到该处理程序。

      注意注意

      由于要注册自定义文件扩展名,因此在 handlers 节和 httpHandlers 节中都要注册该处理程序。 为了向后兼容,在经典模式下要使用 modules 特性将该处理程序指定为 ISAPI 模块。 使用 scriptProcessor 特性指定 ASP.NET ISAPI dll 的路径。 name 特性在 handlers 节中是必需的。

    在运行于集成模式下的 IIS 7.0 中注册处理程序

    1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

    2. 将下面突出显示的元素添加到 Web.config 文件中。

      <configuration>
        <system.webServer>
          <handlers>
            <add verb="*" path="*.SampleAsync"
              name="HelloWorldAsyncHandler"
              type="HelloWorldAsyncHandler"/>
          </handlers>
        </system.webServer>
      </configuration>
      

      配置元素按类名注册自定义处理程序,并将 .SampleAsync 文件扩展名映射到该处理程序。

      注意注意

      注册在 handlers 节中进行,而不是在 httpHandlers 节中进行。 需要 name 特性。

    创建并注册自定义 HTTP 处理程序后,可以对该处理程序进行测试。

    测试自定义 HTTP 处理程序

    • 浏览至应用程序,然后在浏览器中输入一个以 .SampleAsync 结尾的 URL。

      将显示在 HelloWorldAsyncHandler 类中定义的文本。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值