標籤:style class color c int get
伺服器端非同步 Web 方法
何時採用非同步 Web 方法
在確定是否適合在您的應用程式中採用非同步 Web 方法時,有幾個問題需要考慮。首先,調用的 BeginXXX 函數必須返回一個 IAsyncResult 介面。IAsyncResult 是從多個非同步 I/O 操作返回的,這些操作包括訪問資料流、進行 Microsoft® Windows® 通訊端調用、執行檔案 I/O、與其他硬體裝置互動、調用非同步方法呼叫,當然也包括調用其他 Web 服務。您可以從這些非同步作業中得到 IAsyncResult,以便從 BeginXXX 函數返回它。您也可以建立自己的類以實現 IAsyncResult 介面,但隨後可能需要以某種方式封裝前面提到的某個 I/O 操作。
對於前面提到的大多數非同步作業,使用非同步 Web 方法封裝後端非同步呼叫很有意義,可以使 Web 服務代碼更有效。但使用委託進行非同步方法呼叫調用時除外。委託會導致非同步方法呼叫調用佔用進程線程池中的某個線程。不幸的是,ASMX 處理常式為進入的請求提供服務時同樣要使用這些線程。所以與對硬體或網路資源執行真正 I/O 操作的調用不同,使用委託的非同步方法呼叫調用在執行時仍將佔用其中一個進程線程。您也可以佔用原來的線程,同步運行您的 Web 方法。
下面的樣本顯示了一個調用後端 Web 服務的非同步 Web 方法。它已經使用 WebMethod 屬性標識了 BeginGetAge 和 EndGetAge 方法,以便非同步運行。此非同步 Web 方法的代碼調用名為 UserInfoQuery 的後端 Web 方法,以獲得它需要返回的資訊。對 UserInfoQuery 的調用被非同步執行,並被傳遞到 AsyncCallback 函數,後者被傳遞到 BeginGetAge 方法。這將導致當後端請求完成時,調用內部回呼函數。然後,回呼函數將調用 EndGetAge 方法以完成請求。此樣本中的代碼比前面樣本中的代碼簡單得多,並且還具有另外一個優點,即沒有在與為中介層 Web 方法請求提供服務的相同線程池中啟動後端處理。
[WebService]
public class GetMyInfo : System.Web.Services.WebService
{
[WebMethod]
public IAsyncResult BeginGetAge(AsyncCallback cb, Object state)
{
// 調用非同步 Web 服務調用。
localhost.UserInfoQuery proxy
= new localhost.UserInfoQuery();
return proxy.BeginGetUserInfo("使用者名稱",
cb,
proxy);
}
[WebMethod]
public int EndGetAge(IAsyncResult res)
{
localhost.UserInfoQuery proxy
= (localhost.UserInfoQuery)res.AsyncState;
int age = proxy.EndGetUserInfo(res).age;
// 在此對 Web 服務的結果進行其他
// 處理。
return age;
}
}
發生在 Web 方法中的最常見的 I/O 操作類型之一是對 SQL 資料庫的調用。不幸的是,目前 Microsoft® ADO.NET 尚未定義一個完好的非同步呼叫機制;而只是將 SQL 調用封裝到非同步委託調用中對提高效率沒有什麼協助。雖然有時可以選擇緩衝結果,但是也應當考慮使用 Microsoft SQL Server 2000 Web Services Toolkit(英文)將您的資料庫發布為 Web 服務。這樣您就可以利用 .NET Framework 中的支援,非同步呼叫 Web 服務以查詢或更新資料庫。
通過 Web 服務調用訪問 SQL 時,需要注意眾多的後端資源。如果您使用了 TCP 通訊端與 Unix 電腦通訊,或者通過專用的資料庫驅動程式訪問其他一些可用的 SQL 平台,甚至具有使用 DCOM 訪問的資源,您都可以考慮使用眾多的 Web 服務工具包將這些資源發布為 Web 服務。
使用這種方法的優點之一是您可以利用用戶端 Web 服務結構的優勢,例如使用 .NET Framework 的非同步 Web 服務調用。這樣您將免費獲得非同步呼叫能力,而您的用戶端訪問機制會與非同步 Web 方法高效率地配合工作。
使用非同步 Web 方法彙總資料
現在,許多 Web 服務都訪問後端的多個資源並為前端的 Web 服務彙總資訊。儘管調用多個後端資源會增加非同步 Web 方法模型的複雜性,但最終還是能夠顯著提高效率。
假設您的 Web 方法調用兩個後端 Web 服務:服務 A 和服務 B。從您的 BeginXXX 函數,您可以非同步呼叫服務 A 和服務 B。您應該向每個非同步呼叫傳遞自己的回呼函數。在從服務 A 和服務 B 接收到結果後,為觸發 Web 方法的完成,您提供的回呼函數將驗證所有的請求都已完成,在返回的資料上進行所有的處理,然後調用傳遞到 BeginXXX 函數的回呼函數。這將觸發對 EndXXX 函數的調用,此函數的返回將導致非同步 Web 方法的完成。
小結
非同步 Web 方法在 ASP.NET Web 服務中提供了一個有效機制,可以調用後端服務,而不會導致佔用卻不利用進程線程池中的寶貴線程。