容易的異步 Web 方法
發(fā)表時(shí)間:2024-02-22 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]何時(shí)采用異步 Web 方法在確定是否適合在您的應(yīng)用程序中采用異步 Web 方法時(shí),有幾個(gè)問題需要考慮。首先,調(diào)用的 BeginXXX 函數(shù)必須返回一個(gè) IAsyncResult 接口。IAsyncResult 是從多個(gè)異步 I/O 操作返回的,這些操作包括訪問數(shù)據(jù)流、進(jìn)行 Microsoft&am...
何時(shí)采用異步 Web 方法
在確定是否適合在您的應(yīng)用程序中采用異步 Web 方法時(shí),有幾個(gè)問題需要考慮。首先,調(diào)用的 BeginXXX 函數(shù)必須返回一個(gè) IAsyncResult 接口。IAsyncResult 是從多個(gè)異步 I/O 操作返回的,這些操作包括訪問數(shù)據(jù)流、進(jìn)行 Microsoft® Windows® 套接字調(diào)用、執(zhí)行文件 I/O、與其他硬件設(shè)備交互、調(diào)用異步方法,當(dāng)然也包括調(diào)用其他 Web 服務(wù)。您可以從這些異步操作中得到 IAsyncResult,以便從 BeginXXX 函數(shù)返回它。您也可以創(chuàng)建自己的類以實(shí)現(xiàn) IAsyncResult 接口,但隨后可能需要以某種方式包裝前面提到的某個(gè) I/O 操作。
對(duì)于前面提到的大多數(shù)異步操作,使用異步 Web 方法包裝后端異步調(diào)用很有意義,可以使 Web 服務(wù)代碼更有效。但使用委托進(jìn)行異步方法調(diào)用時(shí)除外。委托會(huì)導(dǎo)致異步方法調(diào)用占用進(jìn)程線程池中的某個(gè)線程。不幸的是,ASMX 處理程序?yàn)檫M(jìn)入的請(qǐng)求提供服務(wù)時(shí)同樣要使用這些線程。所以與對(duì)硬件或網(wǎng)絡(luò)資源執(zhí)行真正 I/O 操作的調(diào)用不同,使用委托的異步方法調(diào)用在執(zhí)行時(shí)仍將占用其中一個(gè)進(jìn)程線程。您也可以占用原來的線程,同步運(yùn)行您的 Web 方法。
下面的示例顯示了一個(gè)調(diào)用后端 Web 服務(wù)的異步 Web 方法。它已經(jīng)使用 WebMethod 屬性標(biāo)識(shí)了 BeginGetAge 和 EndGetAge 方法,以便異步運(yùn)行。此異步 Web 方法的代碼調(diào)用名為 UserInfoQuery 的后端 Web 方法,以獲得它需要返回的信息。對(duì) UserInfoQuery 的調(diào)用被異步執(zhí)行,并被傳遞到 AsyncCallback 函數(shù),后者被傳遞到 BeginGetAge 方法。這將導(dǎo)致當(dāng)后端請(qǐng)求完成時(shí),調(diào)用內(nèi)部回調(diào)函數(shù)。然后,回調(diào)函數(shù)將調(diào)用 EndGetAge 方法以完成請(qǐng)求。此示例中的代碼比前面示例中的代碼簡(jiǎn)單得多,并且還具有另外一個(gè)優(yōu)點(diǎn),即沒有在與為中間層 Web 方法請(qǐng)求提供服務(wù)的相同線程池中啟動(dòng)后端處理。
[WebService]
public class GetMyInfo : System.Web.Services.WebService
{
[WebMethod]
public IAsyncResult BeginGetAge(AsyncCallback cb, Object state)
{
// 調(diào)用異步 Web 服務(wù)調(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;
// 在此對(duì) Web 服務(wù)的結(jié)果進(jìn)行其他
// 處理。
return age;
}
}
發(fā)生在 Web 方法中的最常見的 I/O 操作類型之一是對(duì) SQL 數(shù)據(jù)庫(kù)的調(diào)用。不幸的是,目前 Microsoft® ADO.NET 尚未定義一個(gè)完好的異步調(diào)用機(jī)制;而只是將 SQL 調(diào)用包裝到異步委托調(diào)用中對(duì)提高效率沒有什么幫助。雖然有時(shí)可以選擇緩存結(jié)果,但是也應(yīng)當(dāng)考慮使用 Microsoft SQL Server 2000 Web Services Toolkit(英文)將您的數(shù)據(jù)庫(kù)發(fā)布為 Web 服務(wù)。這樣您就可以利用 .NET Framework 中的支持,異步調(diào)用 Web 服務(wù)以查詢或更新數(shù)據(jù)庫(kù)。
通過 Web 服務(wù)調(diào)用訪問 SQL 時(shí),需要注意眾多的后端資源。如果您使用了 TCP 套接字與 Unix 計(jì)算機(jī)通信,或者通過專用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序訪問其他一些可用的 SQL 平臺(tái),甚至具有使用 DCOM 訪問的資源,您都可以考慮使用眾多的 Web 服務(wù)工具包將這些資源發(fā)布為 Web 服務(wù)。
使用這種方法的優(yōu)點(diǎn)之一是您可以利用客戶端 Web 服務(wù)結(jié)構(gòu)的優(yōu)勢(shì),例如使用 .NET Framework 的異步 Web 服務(wù)調(diào)用。這樣您將免費(fèi)獲得異步調(diào)用能力,而您的客戶端訪問機(jī)制會(huì)與異步 Web 方法高效率地配合工作。
使用異步 Web 方法聚合數(shù)據(jù)
現(xiàn)在,許多 Web 服務(wù)都訪問后端的多個(gè)資源并為前端的 Web 服務(wù)聚合信息。盡管調(diào)用多個(gè)后端資源會(huì)增加異步 Web 方法模型的復(fù)雜性,但最終還是能夠顯著提高效率。
假設(shè)您的 Web 方法調(diào)用兩個(gè)后端 Web 服務(wù):服務(wù) A 和服務(wù) B。從您的 BeginXXX 函數(shù),您可以異步調(diào)用服務(wù) A 和服務(wù) B。您應(yīng)該向每個(gè)異步調(diào)用傳遞自己的回調(diào)函數(shù)。在從服務(wù) A 和服務(wù) B 接收到結(jié)果后,為觸發(fā) Web 方法的完成,您提供的回調(diào)函數(shù)將驗(yàn)證所有的請(qǐng)求都已完成,在返回的數(shù)據(jù)上進(jìn)行所有的處理,然后調(diào)用傳遞到 BeginXXX 函數(shù)的回調(diào)函數(shù)。這將觸發(fā)對(duì) EndXXX 函數(shù)的調(diào)用,此函數(shù)的返回將導(dǎo)致異步 Web 方法的完成。
小結(jié)
異步 Web 方法在 ASP.NET Web 服務(wù)中提供了一個(gè)有效的機(jī)制,可以調(diào)用后端服務(wù),而不會(huì)導(dǎo)致占用卻不利用進(jìn)程線程池中的寶貴線程。通過結(jié)合對(duì)后端資源的異步請(qǐng)求,服務(wù)器可以使用自己的 Web 方法使同時(shí)處理的請(qǐng)求數(shù)目達(dá)到最大。您應(yīng)該考慮使用此方法開發(fā)高性能的 Web 服務(wù)應(yīng)用程序。