实践:创建异步 HTTP 处理器
異步 HTTP 處理器允許你啟動外部進程(比如一個調(diào)用遠程服務(wù)器的方法),并且在無需等待外部進程被完成的情況之下繼續(xù)處理器自身的處理。另外,在處理一個異步 HTTP 處理器的期間,ASP.NET 還會把通常用于外部進程的線程返回到線程池中,直到處理器從外部進程中接收到一個回調(diào)為止。這樣能夠防止線程阻塞并且能夠改進性能,因為在同一時間內(nèi)只有為數(shù)不多的線程才能夠被執(zhí)行。如果有許多用戶請求了依賴于外部進程的同步 HTTP 處理器,那么操作系統(tǒng)就能夠脫離線程而得到高速運行,因為許多線程都已經(jīng)被阻塞并且需要等待外部進程的結(jié)束。
下列代碼示范了一個在 ASP.NET 應(yīng)用程序中對擴展名是 .SampleAsync 的文件的請求進行處理的異步 HTTP 處理器。這個范例說明了這個處理器的代碼,然后說明了如何把擴展名 .SampleAsync 映射到 ASP.NET 中的處理器。最后,這個范例還說明了如何在 IIS 中把擴展名 .SampleAsync 映射到 ASP.NET,因此 IIS 會把以 .SampleAsync 為結(jié)尾的請求轉(zhuǎn)送給 ASP.NET。
關(guān)于 ASP.NET 運行時如何與 IIS 相互作用的更多信息,請參考:[ASP.NET 應(yīng)用程序生命周期概覽]。
創(chuàng)建名為 HelloWorldAsyncHandler 的 HTTP 處理器類
- 在你的 App_Code 目錄中創(chuàng)建名為 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);}
}
代碼中實現(xiàn)了 BeginProcessRequest 方法。這個方法把一個字符串寫入到了當(dāng)前 HttpContext 對象的 Response 屬性中,并且創(chuàng)建了 AsyncOperation 類的一個新實例,還調(diào)用了 StartAsyncWork 方法。然后 StartAsyncWork 方法會把 StartAsyncTask 代理添加到 ThreadPool 對象中。當(dāng)線程開始生效的時候,StartAsyncTask 方法就會被調(diào)用,并且會輸出另外一個字符串到 Response 屬性中,然后通過調(diào)用 AsyncCallback 代理來完成其他任務(wù)。
注冊自定義 HTTP 處理器
一旦你的自定義 HTTP 處理器類被創(chuàng)建,你就必須把它注冊到 Web.config 文件中,這樣 ASP.NET 才能夠為擴展名是 .SampleAsync 的文件請求提供服務(wù)。
在 Web.config 文件中注冊自定義 HTTP 處理器
以上代碼把 HelloWorldAsyncHandler 處理器注冊成了對以 .SampleAsync 作為結(jié)尾的請求而提供服務(wù)的處理器。
在 IIS 中配置 HTTP 處理器擴展
IIS 只把特定文件類型的請求傳遞給 ASP.NET 的服務(wù)。默認時,擴展名是 .aspx、.ascx,.asmx 的文件都已經(jīng)被映射到了 ASP.NET。但是,如果你需要 ASP.NET 處理自定義的文件擴展名,那么你就必須在 IIS 中進行注冊。關(guān)于更多信息,請參考:[ASP.NET 應(yīng)用程序生命周期概覽]。
在 IIS 中映射擴展名
測試自定義 HTTP 處理器
一旦你已經(jīng)創(chuàng)建并且已經(jīng)注冊你的自定義 HTTP 處理器,那么你就可以通過從應(yīng)用程序中發(fā)送一個擴展名是 .SampleAsync 的請求來對它進行測試。
測試你的自定義 HTTP 處理器
- 瀏覽到你的應(yīng)用程序并且在瀏覽器中輸入一個以 .SampleAsync 作為結(jié)尾的 URL。
轉(zhuǎn)載于:https://www.cnblogs.com/Laeb/archive/2007/03/15/675711.html
總結(jié)
以上是生活随笔為你收集整理的实践:创建异步 HTTP 处理器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Configuration Manage
- 下一篇: 数字油田