代码改变世界

[翻译]创建异步的HTTP处理程序(Create an Asynchronous HTTP Handler)

2010-05-17 01:35  Kevin-wang  阅读(543)  评论(0编辑  收藏  举报

原文:http://msdn.microsoft.com/en-us/library/ms227433%28v=VS.100%29.aspx

 

文章以图解的形式介绍以下的内容:

  • 如何创建HTTP处理程序类,此类必须实现ProcessRequest方法和IsReusable属性.

  • 如何在Web.config文件中注册这个处理程序和文件扩展名SampleAsync与处理程序的映射

  • 如何通过IIS将文件扩展名.SampleAsync映射到ASP.NET中.

前提条件

完成这个预研,必须满足的条件:

  • Visual Studio 或 Visual Web Developer.

  • 运行在IIS上的ASP.NET网站.

  • IIS 6.0 或 IIS 7.0.

 

创建异步的HTTP处理程序类

下面开始创建一个异步HTTP处理程序实现类.

创建一个名为HelloWorldAsyncHandler的HTTP处理程序类

  1. 如果你的网站目录中不存在App_Code目录,在站点的根目录下创建App_Code目录.

  2. 在App_Code目录,创建名叫HelloWorldAsyncHandler的文件并添加下面的代码.

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委托.

 

在IIS6.0中注册自定义的HTTP处理程序(Handler)

创建完自定义的HTTP处理程序后,必须在应用程序的Web.config文件中注册. 当URL中是以.SampleAsync结尾的IIS请求时ASP.NET允许这个处理程序处理这个请求.

注册这个处理程序区别主要依赖于是工作在IIS6.0还是IIS7.0,这一节将介绍如何在IIS6.0下注册处理程序.下一节将介绍如何在IIS7.0下注册处理程序.

在IIS6.0中注册

  1. 如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.

  2. 在Web.config文件中增加下面高亮标注的部分

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

配置项注册的HelloWorldAsyncHandler 处理程序处理所有的以.SampleAsync结尾的的请求.

使用IIS管理器进行文件扩展名.SampleAsync,更多的信息,请看How to: Configure an HTTP Handler Extension in IIS.

 

在IIS7.0中注册自定义的HTTP处理程序(Handler)

在IIS7.0中,应用程序可以运行在Classic(经典)或Integrated(集成)两种模式其中的一种.在Classic模式中,请求的处理与工作在IIS6.0下非常的相似.在Integrated模式中,IIS 7.0 使用一种管道技术 允许通过asp.net技术分享访问请求、模块和其他特性.

IIS7.0中,使用Web.config或IIS管理器注册handler,因为IIS7.0是集中管理,在应用程序的Web.config中的更改会反映到IIS管理器,下面的处理是在Web.config中注册.

 

在IIS7Classic模式下注册

  1. 如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.

  2. 在Web.config文件中增加下面高亮标注的部分

%path%将被aspnet_isapi.dll文件的路径替代,这个dll文件在.Net Framework安装目录下,默认是在C:\WINDOWS\Microsoft.NET\Framework\version.

<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的请求处理映射到配置项注册的处理自定义处理程序上.

在IIS7Integrated模式下注册

  1. 如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.

  2. 在Web.config文件中增加下面高亮标注的部分

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

文件名结尾以.SampleAsync的请求处理映射到配置项注册的处理自定义处理程序上,在handlers节中,name属性是必须有的.

 

开始测试自定义HTTP处理程序

自定义HTTP处理程序创建和注册后,就可以测试它了

  • 在浏览器中浏览应用程序并输入一个以.SampleAsync结尾的URL.

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

 

完毕.

英语水平有限,有一些地方用词不当.