明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

服務器端異步 Web 方法

[摘要]何時采用異步 Web 方法在確定是否適合在您的應用程序中采用異步 Web 方法時,有幾個問題需要考慮。首先,調(diào)用的 BeginXXX 函數(shù)必須返回一個 IAsyncResult 接口。IAsyncR...
何時采用異步 Web 方法

在確定是否適合在您的應用程序中采用異步 Web 方法時,有幾個問題需要考慮。首先,調(diào)用的 BeginXXX 函數(shù)必須返回一個 IAsyncResult 接口。IAsyncResult 是從多個異步 I/O 操作返回的,這些操作包括訪問數(shù)據(jù)流、進行 Microsoft® Windows® 套接字調(diào)用、執(zhí)行文件 I/O、與其他硬件設(shè)備交互、調(diào)用異步方法,當然也包括調(diào)用其他 Web 服務。您可以從這些異步操作中得到 IAsyncResult,以便從 BeginXXX 函數(shù)返回它。您也可以創(chuàng)建自己的類以實現(xiàn) IAsyncResult 接口,但隨后可能需要以某種方式包裝前面提到的某個 I/O 操作。

對于前面提到的大多數(shù)異步操作,使用異步 Web 方法包裝后端異步調(diào)用很有意義,可以使 Web 服務代碼更有效。但使用委托進行異步方法調(diào)用時除外。委托會導致異步方法調(diào)用占用進程線程池中的某個線程。不幸的是,ASMX 處理程序為進入的請求提供服務時同樣要使用這些線程。所以與對硬件或網(wǎng)絡(luò)資源執(zhí)行真正 I/O 操作的調(diào)用不同,使用委托的異步方法調(diào)用在執(zhí)行時仍將占用其中一個進程線程。您也可以占用原來的線程,同步運行您的 Web 方法。

下面的示例顯示了一個調(diào)用后端 Web 服務的異步 Web 方法。它已經(jīng)使用 WebMethod 屬性標識了 BeginGetAge 和 EndGetAge 方法,以便異步運行。此異步 Web 方法的代碼調(diào)用名為 UserInfoQuery 的后端 Web 方法,以獲得它需要返回的信息。對 UserInfoQuery 的調(diào)用被異步執(zhí)行,并被傳遞到 AsyncCallback 函數(shù),后者被傳遞到 BeginGetAge 方法。這將導致當后端請求完成時,調(diào)用內(nèi)部回調(diào)函數(shù)。然后,回調(diào)函數(shù)將調(diào)用 EndGetAge 方法以完成請求。此示例中的代碼比前面示例中的代碼簡單得多,并且還具有另外一個優(yōu)點,即沒有在與為中間層 Web 方法請求提供服務的相同線程池中啟動后端處理。

[WebService]

public class GetMyInfo : System.Web.Services.WebService

{

[WebMethod]

public IAsyncResult BeginGetAge(AsyncCallback cb, Object state)

{

// 調(diào)用異步 Web 服務調(diào)用。

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 服務的結(jié)果進行其他

// 處理。

return age;

}

}

發(fā)生在 Web 方法中的最常見的 I/O 操作類型之一是對 SQL 數(shù)據(jù)庫的調(diào)用。不幸的是,目前 Microsoft® ADO.NET 尚未定義一個完好的異步調(diào)用機制;而只是將 SQL 調(diào)用包裝到異步委托調(diào)用中對提高效率沒有什么幫助。雖然有時可以選擇緩存結(jié)果,但是也應當考慮使用 Microsoft SQL Server 2000 Web Services Toolkit(英文)將您的數(shù)據(jù)庫發(fā)布為 Web 服務。這樣您就可以利用 .NET Framework 中的支持,異步調(diào)用 Web 服務以查詢或更新數(shù)據(jù)庫。

通過 Web 服務調(diào)用訪問 SQL 時,需要注意眾多的后端資源。如果您使用了 TCP 套接字與 Unix 計算機通信,或者通過專用的數(shù)據(jù)庫驅(qū)動程序訪問其他一些可用的 SQL 平臺,甚至具有使用 DCOM 訪問的資源,您都可以考慮使用眾多的 Web 服務工具包將這些資源發(fā)布為 Web 服務。

使用這種方法的優(yōu)點之一是您可以利用客戶端 Web 服務結(jié)構(gòu)的優(yōu)勢,例如使用 .NET Framework 的異步 Web 服務調(diào)用。這樣您將免費獲得異步調(diào)用能力,而您的客戶端訪問機制會與異步 Web 方法高效率地配合工作。

使用異步 Web 方法聚合數(shù)據(jù)

現(xiàn)在,許多 Web 服務都訪問后端的多個資源并為前端的 Web 服務聚合信息。盡管調(diào)用多個后端資源會增加異步 Web 方法模型的復雜性,但最終還是能夠顯著提高效率。

假設(shè)您的 Web 方法調(diào)用兩個后端 Web 服務:服務 A 和服務 B。從您的 BeginXXX 函數(shù),您可以異步調(diào)用服務 A 和服務 B。您應該向每個異步調(diào)用傳遞自己的回調(diào)函數(shù)。在從服務 A 和服務 B 接收到結(jié)果后,為觸發(fā) Web 方法的完成,您提供的回調(diào)函數(shù)將驗證所有的請求都已完成,在返回的數(shù)據(jù)上進行所有的處理,然后調(diào)用傳遞到 BeginXXX 函數(shù)的回調(diào)函數(shù)。這將觸發(fā)對 EndXXX 函數(shù)的調(diào)用,此函數(shù)的返回將導致異步 Web 方法的完成。

小結(jié)

異步 Web 方法在 ASP.NET Web 服務中提供了一個有效的機制,可以調(diào)用后端服務,而不會導致占用卻不利用進程線程池中的寶貴線程。通過結(jié)合對后端資源的異步請求,服務器可以使用自己的 Web 方法使同時處理的請求數(shù)目達到最大。您應該考慮使用此方法開發(fā)高性能的 Web 服務應用程序。