技巧:服務器端異步 Web 方法

 在九月份的第三篇專欄(英文)中,我談到了利用 Microsoftreg; .NET Framework 的客戶端功能經過 HTTP 異步調用 Web 服務的問題。這種調用 Web 服務的方法很是有用,使用時沒必要鎖定您的應用程序或產生過多後臺線程。如今咱們瞭解一下在服務器端提供相似功能的異步 Web 方法。異步 Web 方法在編寫 ISAPI 擴展方面具備與 HSE_STATUS_PENDING 方法相似的高性能,但不須要爲管理本身的線程池編寫代碼,同時又具備以託管代碼方式運行的全部優勢。 

首先咱們考慮一下常規的同步 Microsoftreg; ASP.NET Web 方法。當您從同步 Web 方法返回時,將發送對該方法的響應。若是須要較長的時間來完成請求,則處理請求的線程會一直被佔用,直到方法調用結束。不幸的是,多數較長的調用是由較長的數據庫查詢或對另外一個 Web 服務的調用等事件引發的。例如,若是您調用數據庫,當前線程會一直等待調用完成。線程無事可作,只是等待,直至聽到查詢的返回。當線程等待完成對 TCP 套接字或後端 Web 服務的調用時,也會出現相似的問題。 

讓線程處於等待狀態很很差,特別是在服務器的運行壓力很大的狀況下。等待中的線程不會進行任何有效工做,例如爲其餘請求提供服務。咱們須要找到一種方法,可以在服務器上開始較長的後臺進程,同時又能將當前線程返回到 ASP.NET 進程池。而後,當較長的後臺進程完成時,咱們調用一個回調函數,結束對請求的處理,並經過某種方式通知 ASP.NET 請求已完成。實際上,這種功能可由 ASP.NET 使用異步 Web 方法提供。 

異步 Web 方法的工做原理 
當您使用 Web 方法編寫典型的 ASP.NET Web 服務時,Microsoftreg; Visual Studioreg; .Net 只是編譯您的代碼以建立程序集;當收到對其 Web 方法的請求時,將調用該程序集。程序集自己並不知道關於 SOAP 的任何事情。所以,當您的應用程序首次啓動時,ASMX 處理程序必須反映您的程序集,以肯定提供哪些 Web 方法。對於常規的同步請求,這些操做都很簡單:找出哪些方法具備關聯的 WebMethod 屬性、基於 SOAPAction HTTP 標頭來設置調用正確方法的邏輯。 

對於異步請求,在反映過程當中,ASMX 處理程序尋找具備某種簽名並將簽名識別爲異步的 Web 方法。該處理程序將尋找符合如下規則的方法對: 

BeginXXX 和 EndXXX Web 方法,其中 XXX 是任意字符串,表示要提供的方法的名稱。 
BeginXXX 函數返回一個 IAsyncResult 接口,並分別接受 AsyncCallback 和一個對象,做爲其最後兩個輸入參數。 

EndXXX 函數接受一個 IAsyncResult 接口,做爲其惟一的參數。 
兩個方法都必須使用 WebMethod 屬性進行標識。 
若是 ASMX 處理程序發現兩個方法符合上述全部條件,則將方法 XXX 做爲常規的 Web 方法在其 WSDL 中提供。該方法將接受在 BeginXXX 的簽名中的 AsyncCallback 參數以前定義的參數做爲輸入,並返回由 EndXXX 函數返回的內容。所以,若是某個 Web 方法具備以下同步聲明:數據庫

相關文章
相關標籤/搜索