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