如何:创建同步/异步 HTTP 处理程序

简介: 来源:MSDN 一、如何:创建同步 HTTP 处理程序 本主题阐释一个 HTTP 处理程序的代码,该处理程序对 ASP.NET 应用程序中其 URL 以 .sample 结尾的资源执行同步请求处理。
  来源:MSDN

一、如何:创建同步 HTTP 处理程序

本主题阐释一个 HTTP 处理程序的代码,该处理程序对 ASP.NET 应用程序中其 URL 以 .sample 结尾的资源执行同步请求处理。此代码示例阐释了下列内容:

·                 一个 HTTP 处理程序类的代码。该类必须实现 ProcessRequest 方法和 IsReusable 属性。

·                 Web.config 文件中注册该处理程序并将 .sample 文件扩展名映射到该处理程序所需的元素。

·                 如何在 Internet 信息服务 (IIS) 中将 .sample 文件扩展名映射到 ASP.NET。

注意

在将配置文件更改为包含对新处理程序的引用后,ASP.NET Development Server 将处理对新资源的请求。若要启用 IIS 以处理该请求,请参见下面的过程。

当用户请求一个其 URL 以 .sample 结尾的资源时,Web 服务器将该请求转发给 ASP.NET。然后 ASP.NET 调用 HTTP 处理程序,后者返回一个响应。该响应由该处理程序动态创建;不需要存在具有文件扩展名 .sample 的文件。有关 ASP.NET 如何与 Web 服务器交互的更多信息,请参见 ASP.NET 生命周期

创建自定义 HelloWorldHandler HTTP 处理程序类

1.        在网站的 App_Code 目录中,创建一个名为 HelloWorldHandler的类。

2.        向类文件中添加下面的代码。

Visual Basic 

复制代码

Imports System.Web

Public Class HelloWorldHandler

    Implements IHttpHandler

    Public Sub ProcessRequest(ByVal context As _

            System.Web.HttpContext) Implements _

            System.Web.IHttpHandler.ProcessRequest

        Dim request As HttpRequest = context.Request

        Dim response As HttpResponse = context.Response

        ' This handler is called whenever a file ending

        ' in .sample is requested. A file with that extension

        ' does not need to exist.

        response.Write("<html>")

        response.Write("<body>")

        response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>")

        response.Write("</body>")

        response.Write("</html>")

    End Sub

    Public ReadOnly Property IsReusable() As Boolean _

            Implements System.Web.IHttpHandler.IsReusable

        Get

            Return False

        End Get

    End Property

End Class

C# 

复制代码

using System.Web;

public class HelloWorldHandler : IHttpHandler

{

    public HelloWorldHandler()

    {

    }

    public void ProcessRequest(HttpContext context)

    {

        HttpRequest Request = context.Request;

        HttpResponse Response = context.Response;

        // This handler is called whenever a file ending

        // in .sample is requested. A file with that extension

        // does not need to exist.

        Response.Write("<html>");

        Response.Write("<body>");

        Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");

        Response.Write("</body>");

        Response.Write("</html>");

    }

    public bool IsReusable

    {

        // To enable pooling, return true here.

        // This keeps the handler in memory.

        get { return false; }

    }

}

3.        这段代码实现 ProcessRequest方法并将一个字符串写出到当前 HttpContext 对象的 Response 属性中。

注册自定义 HTTP 处理程序

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

在 Web.config 文件中注册自定义 HTTP 处理程序

1.        将一个 Web.config 文件添加到网站(如果该文件尚未存在)。

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

 

复制代码

<configuration>

    <system.web>

        <httpHandlers>            <add verb="*" path="*.sample"                   type="HelloWorldHandler"/>        </httpHandlers>

    </system.web>

</configuration>

3.        这段代码按类名注册自定义处理程序,并将 .sample 文件扩展名映射到该处理程序。

在 IIS 6.0 中配置 HTTP 处理程序扩展名

IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等文件扩展名的文件在 IIS 6.0 中已映射为 ASP.NET ISAPI 扩展名 (Aspnet_isapi.dll)。但如果希望 ASP.NET 处理自定义 URL 扩展名,则必须在 IIS 中映射这些扩展名。有关更多信息,请参见 ASP.NET 生命周期

在 IIS 6.0 中将 .sample 文件扩展名映射到 ASP.NET

1.        打开“Internet 信息服务(IIS)管理器”。

2.        右击应用程序的名称,然后单击“属性”。

注意

有关创建 ASP.NET 应用程序的说明,请参见如何:在 IIS 中创建和配置本地 ASP.NET 网站。

3.        单击“虚拟目录”选项卡,然后单击“配置”。

4.        在“映射”选项卡上,单击“添加”。

将显示“添加/编辑应用程序扩展名映射”对话框。

5.        在“可执行文件”框中,键入或浏览至 Aspnet_isapi.dll 文件。默认情况下,该文件位于以下位置。

 

复制代码

%windows%"Microsoft.NET"Framework"version"

注意

可以从其他映射(如 .aspx 文件的映射)获得完整路径和文件名。

6.        在“扩展名”框中,键入 .sample

7.        清除“确认文件是否存在”复选框。

8.        单击“确定”,然后关闭 IIS 管理器。

测试自定义 HTTP 处理程序

创建并注册了自定义 HTTP 处理程序后,可以通过请求具有 .sample 文件扩展名的资源对其进行测试。

测试自定义 HTTP 处理程序

·                 在浏览器中,输入一个指向 Web 应用程序并以 .sample 结尾的 URL,如下所示:

 

复制代码

http://localhost/SampleApplication/test.sample

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


     

二、如何:创建异步 HTTP 处理程序

使用异步 HTTP 处理程序,您可以在启动一个外部进程(例如对远程服务器的方法调用)的同时继续该处理程序的处理工作,而不必等待外部进程的完成。在异步 HTTP 处理程序的处理期间,ASP.NET 将通常用于外部进程的线程放回线程池中,直到处理程序收到来自外部进程的回调。这样可以避免阻止线程,从而提高性能,因为一次只能执行有限数量的线程。如果许多用户都在请求依赖于外部进程的同步 HTTP 处理程序,那么操作系统可能很快就会用完所有线程,因为大量线程被阻止,正在等待外部进程。

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

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

创建 HelloWorldAsyncHandler HTTP 处理程序类

·                 在 App_Code 目录中创建一个名为 HelloWorldAsyncHandler的类,并向类文件中添加以下代码:

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 处理程序

在创建了自定义 HTTP 处理程序类之后,必须在 Web.config 文件中注册该类,以便由 ASP.NET 来处理对带有 .SampleAsync 扩展名的文件的请求。

在 Web.config 文件中注册自定义 HTTP 处理程序

1.        如果您的网站没有 Web.config 文件,请创建一个 Web.config 文件。

2.        向 Web.config 文件添加下面的代码:

C#

 

<configuration>

 <system.web>

    <httpHandlers>

      <add verb="*" path="*.SampleAsync"

        type="HelloWorldAsyncHandler"/>

    </httpHandlers>

 </system.web>

</configuration>

3.        该代码将 HelloWorldAsyncHandler处理程序注册为对以 .SampleAsync 结尾的请求的处理程序。

为 HTTP 处理程序扩展名配置 IIS

IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等扩展名的文件已映射到 ASP.NET,但是,如果您希望由 ASP.NET 来处理您所定义的文件扩展名,则必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述

在 IIS 中映射扩展名

1.        打开“Internet 服务管理器”。

2.        右击您的应用程序,然后选择“属性”。

3.        在“目录”选项卡中,单击“配置”。

4.        选择“映射”选项卡。

5.        添加一个新的关联,将 .SampleAsync 映射到要使用的 Aspnet_isapi.dll 版本。

6.        如果希望无论是否存在用户请求的文件名,该处理程序都将运行,请清除“检查文件是否存在”复选框。

测试自定义 HTTP 处理程序

在创建并注册自定义 HTTP 处理程序之后,就可以通过在应用程序中请求具有 .SampleAsync 扩展名的资源来测试该处理程序。

测试自定义 HTTP 处理程序

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



 

目录
相关文章
|
6月前
|
网络安全 开发工具 git
在GitLab CI中同步HTTPS仓库地址的yaml配置
最后,提交并推送 `.gitlab-ci.yml`文件到您的GitLab仓库。GitLab CI/CD将自动识别这个文件,并在每次推送到 `master`分支时执行定义的同步任务。
303 16
|
11月前
|
数据采集 安全 网络安全
使用aiohttp实现异步HTTPS爬虫的SSL优化
使用aiohttp实现异步HTTPS爬虫的SSL优化
575 81
|
11月前
|
网络协议 前端开发
为什么异步会导致HTTP队首阻塞?
总的来说,异步操作可能会导致HTTP队首阻塞,但是通过使用HTTP/2的多路复用技术,我们可以有效地解决这个问题。
291 16
|
数据采集 Rust 安全
异步读取HTTP响应体的Rust实现
异步读取HTTP响应体的Rust实现
304 13
|
JavaScript 前端开发
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
567 148
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
336 3
|
网络协议
Lua中实现异步HTTP请求的方法
Lua中实现异步HTTP请求的方法
|
数据采集 JSON API
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
本文探讨了在.NET环境下,如何通过异步方法和HTTP请求提高Web爬虫的响应速度和数据抓取效率。介绍了使用HttpClient结合async和await关键字实现异步HTTP请求,避免阻塞主线程,并通过设置代理IP、user-agent和cookie来优化爬虫性能。提供了代码示例,演示了如何集成这些技术以绕过目标网站的反爬机制,实现高效的数据抓取。最后,通过实例展示了如何应用这些技术获取API的JSON数据,强调了这些方法在提升爬虫性能和可靠性方面的重要性。
341 1
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
|
XML 前端开发 JavaScript
JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!
JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!
332 1
|
存储 运维 Serverless
Serverless 应用引擎产品使用合集之使用http异步任务,怎么能很快的根据任务数进行扩缩容
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。

热门文章

最新文章

下一篇
开通oss服务