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

  来源: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。

 

时间: 2024-09-20 05:41:03

如何:创建同步/异步 HTTP 处理程序的相关文章

ASP.NET之自定义异步HTTP处理程序(图文教程)_实用技巧

一.前言 1.对读者想说的话:(可跳过) 在此我感谢那些看了<ASP.NET之自定义同步HTTP处理程序>这篇文章以及看到了这篇<ASP.NET 之 自定义 异步HTTP处理程序>的亲们.前面的那篇可能看过MSDN的亲们一定会发现很多熟悉的地方.而我其实就是比较详细的介绍了一下,让大家更好的理解       PS:MSDN从头到尾都是文字且文字很统一,恐怕很多人都感觉畏惧,懒的去看,所以我将其重要的部分提取出来,使用易懂的例子和简洁的语言来叙述.当然其中也免不了错误,希望各位亲们可

同步异步动态引入js文件的几种方法总结_javascript技巧

动态加载js文件 有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 <div id="divId"></div> <script> 二.异步加载,并发执行,但引入js内容不能直接使用 //1.1 直接document.write document.write("<script src='test.js'><\/script>

不同服务器上的mysql数据库如何实现同步异步备份

1.服务器状态 服务器A:192.168.1.1 服务器B:192.168.1.2 2.创建同步用户 主机域A:192.168.1.2 用户名A:sync_a 密码A:aaa 主机域B:192.168.1.1 用户名B:sync_b 密码B:bbb 至少分配以下权限grant replication slave 3.执行flush privileges 4.停止MySQL 5.配置my.cnf(my.ini) 服务器A 服务器B user = mysql log-bin = mysql-bin

同步/异步 阻塞/非阻塞 .

http://blog.csdn.net/lb85858585/article/details/6693458  同步/异步与阻塞/非阻塞的区别 我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别. 这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方. 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如我去银行办理业务,可能选择排队等候,

[转]举例说同步异步阻塞非阻塞机制

劫匪冲进某花园小别墅,端着AK47,向某衰男甩过去一个袋子:说,快,把现金拿出来给我放进去,这个时候劫匪一直跟着衰男去装钱,看钱装满了他就拿走,此时劫匪是阻塞 的,因为劫匪不能干其他的,得看着这个衰男,免得他搞鬼.    想象下,如果劫匪等衰男自己去装钱,在钱装满之前,他自己可以到处翻箱倒柜,找点值钱的首饰黄金之类的,那么这个时候劫匪就是非阻塞 的,因为劫匪并没有阻塞在衰男去装钱这个环节上,劫匪可以自由活动做点其他的小买卖.       再来回顾下上面的情节,如果劫匪在抢*劫时需要不时自己看看衰

Windows I/O模型、同步/异步、阻塞/非阻塞

同步 异步 异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者.以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行.当连接真正建立起来以后,socket底层会发送一个消息通知该对象.这里提到执行 部件和调用者通过三种途径返回结果:状态.通知和回调.可以使用哪

听说httpwebreqeust也有同步异步,那么跟线程的同异步有什么区别呢?

问题描述 听说httpwebreqeust也有同步异步,那么跟线程的同异步有什么区别呢? 解决方案 解决方案二:没有线程哪来的异步啊.就好象你用c#编程,别人问题"你用这个编程那么跟机器语言有什么关系啊?",你就可以回答"机器不执行机器语言,哪来的c#啊".解决方案三:这里的同步与线程同步不是一个概念.线程同步是指多个线程同时访问一个变量或对象的情景httpwebrequest的同步(即同步代码)与我们多数的编程情景是一样的,下一行执行的代码依赖前一句执行完成才能继

同步异步复位的区别

同步异步复位知识 同步复位:跟时钟clk有关 异步复位:跟时钟clk无关.   什么时候用到同步,异步复位? 答:当clk不稳定时,应该用到异步复位:当clk稳定时,可以用到同步复位.   异步复位:(敏感信号列表中有negedge rst_n) always@(posedge clk or negedge rst_n)     if(!rst_n)         ......     else begin         ...... end   同步复位:  always@(posedge

关于JQuery 调用后台webmethod实现用户名验证,关于同步异步——求大神给个解决方案

问题描述 困扰我了一个多星期了,小弟新手,求大神给个解决方案1,前台ui:两个textbox:RequestorAlias和RequestorName.两个dropdownlist:Region和Country要实现的功能是,在RequestorAlias的textbox里填写一个新的字符串,后台验证合法以后,联动的改变RequestorName的值.2,前台js代码的实现:functiontxtRequestorAlias_TextChanged(str){strFullPath=newStr