[翻译]创建异步的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处理程序类
-
如果你的网站目录中不存在App_Code目录,在站点的根目录下创建App_Code目录.
-
在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中注册
-
如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.
-
在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模式下注册
-
如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.
-
在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模式下注册
-
如果你的网站不存在Web.config文件,在站点的根目录下创建Web.config文件.
-
在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类中定义的文本将被显示.
完毕.
英语水平有限,有一些地方用词不当.