国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 服務(wù)器 > Web服務(wù)器 > 正文

技巧:服務(wù)器端異步 Web 方法

2024-09-01 13:42:15
字體:
供稿:網(wǎng)友

在九月份的第三篇專欄(英文)中,我談到了利用 Microsoftreg; .NET Framework 的客戶端功能通過 HTTP 異步調(diào)用 Web 服務(wù)的問題。這種調(diào)用 Web 服務(wù)的方法非常有用,使用時(shí)不必鎖定您的應(yīng)用程序或產(chǎn)生過多后臺(tái)線程。現(xiàn)在我們了解一下在服務(wù)器端提供類似功能的異步 Web 方法。異步 Web 方法在編寫 ISAPI 擴(kuò)展方面具有與 HSE_STATUS_PENDING 方法類似的高性能,但不需要為管理自己的線程池編寫代碼,同時(shí)又具有以托管代碼方式運(yùn)行的所有優(yōu)點(diǎn)。

首先我們考慮一下常規(guī)的同步 Microsoftreg; ASP.NET Web 方法。當(dāng)您從同步 Web 方法返回時(shí),將發(fā)送對(duì)該方法的響應(yīng)。如果需要較長(zhǎng)的時(shí)間來完成請(qǐng)求,則處理請(qǐng)求的線程會(huì)一直被占用,直到方法調(diào)用結(jié)束。不幸的是,多數(shù)較長(zhǎng)的調(diào)用是由較長(zhǎng)的數(shù)據(jù)庫(kù)查詢或?qū)α硪粋€(gè) Web 服務(wù)的調(diào)用等事件引起的。例如,如果您調(diào)用數(shù)據(jù)庫(kù),當(dāng)前線程會(huì)一直等待調(diào)用完成。線程無事可做,只是等待,直至聽到查詢的返回。當(dāng)線程等待完成對(duì) TCP 套接字或后端 Web 服務(wù)的調(diào)用時(shí),也會(huì)出現(xiàn)類似的問題。

讓線程處于等待狀態(tài)很不好,特別是在服務(wù)器的運(yùn)行壓力很大的情況下。等待中的線程不會(huì)進(jìn)行任何有效工作,例如為其他請(qǐng)求提供服務(wù)。我們需要找到一種方法,能夠在服務(wù)器上開始較長(zhǎng)的后臺(tái)進(jìn)程,同時(shí)又能將當(dāng)前線程返回到 ASP.NET 進(jìn)程池。然后,當(dāng)較長(zhǎng)的后臺(tái)進(jìn)程完成時(shí),我們調(diào)用一個(gè)回調(diào)函數(shù),結(jié)束對(duì)請(qǐng)求的處理,并通過某種方式通知 ASP.NET 請(qǐng)求已完成。實(shí)際上,這種功能可由 ASP.NET 使用異步 Web 方法提供。

異步 Web 方法的工作原理

當(dāng)您使用 Web 方法編寫典型的 ASP.NET Web 服務(wù)時(shí),Microsoftreg; Visual Studioreg; .Net 只是編譯您的代碼以創(chuàng)建程序集;當(dāng)收到對(duì)其 Web 方法的請(qǐng)求時(shí),將調(diào)用該程序集。程序集本身并不知道關(guān)于 SOAP 的任何事情。因此,當(dāng)您的應(yīng)用程序首次啟動(dòng)時(shí),ASMX 處理程序必須反映您的程序集,以確定提供哪些 Web 方法。對(duì)于常規(guī)的同步請(qǐng)求,這些操作都很簡(jiǎn)單:找出哪些方法具有關(guān)聯(lián)的 WebMethod 屬性、基于 SOAPAction HTTP 標(biāo)頭來設(shè)置調(diào)用正確方法的邏輯。

對(duì)于異步請(qǐng)求,在反映過程中,ASMX 處理程序?qū)ふ揖哂心撤N簽名并將簽名識(shí)別為異步的 Web 方法。該處理程序?qū)ふ曳弦韵乱?guī)則的方法對(duì):

BeginXXX 和 EndXXX Web 方法,其中 XXX 是任意字符串,表示要提供的方法的名稱。

BeginXXX 函數(shù)返回一個(gè) IAsyncResult 接口,并分別接受 AsyncCallback 和一個(gè)對(duì)象,作為其最后兩個(gè)輸入?yún)?shù)。

EndXXX 函數(shù)接受一個(gè) IAsyncResult 接口,作為其唯一的參數(shù)。

兩個(gè)方法都必須使用 WebMethod 屬性進(jìn)行標(biāo)識(shí)。

如果 ASMX 處理程序發(fā)現(xiàn)兩個(gè)方法符合上述所有條件,則將方法 XXX 作為常規(guī)的 Web 方法在其 WSDL 中提供。該方法將接受在 BeginXXX 的簽名中的 AsyncCallback 參數(shù)之前定義的參數(shù)作為輸入,并返回由 EndXXX 函數(shù)返回的內(nèi)容。因此,如果某個(gè) Web 方法具有如下同步聲明:

[WebMethod]

public string LengthyProcedure(int milliseconds) {...}

則異步聲明將為:

[WebMethod]

public IAsyncResult BeginLengthyProcedure(

int milliseconds,

AsyncCallback cb,

object s) {...}

[WebMethod]

public string EndLengthyProcedure(IAsyncResult call) {...}

每個(gè)方法的 WSDL 都是相同的。

在 ASMX 處理程序反映程序集并檢測(cè)到某個(gè)異步 Web 方法后,它必須以不同于處理同步請(qǐng)求的方式處理對(duì)該方法的請(qǐng)求。它將調(diào)用 BeginXXX 方法,而不是某個(gè)簡(jiǎn)單方法。它將傳入的請(qǐng)求還原序列化到要傳遞到函數(shù)的參數(shù)中(與處理同步請(qǐng)求時(shí)一樣);但是它還將指針傳遞到一個(gè)內(nèi)部回調(diào)函數(shù)(作為 BeginXXX 方法的額外 AsyncCallback 參數(shù))。

這種方法類似于 .NET Framework 中 Web 服務(wù)客戶端應(yīng)用程序的異步編程模式。如果客戶端支持異步 Web 服務(wù)調(diào)用,則可以為客戶端計(jì)算機(jī)釋放占用的線程;如果服務(wù)器端支持異步 Web 服務(wù)調(diào)用,則可以釋放服務(wù)器計(jì)算機(jī)上占用的線程。但這里有兩個(gè)關(guān)鍵的區(qū)別。首先,不是由服務(wù)器代碼調(diào)用 BeginXXX 和 EndXXX 函數(shù),而是由 ASMX 處理程序調(diào)用。其次,您要為 BeginXXX 和 EndXXX 函數(shù)編寫代碼,而不能使用由 WSDL.EXE 或 Visual Studio .NET 中的 Add Web Reference(添加 Web 引用)向?qū)傻拇a。但結(jié)果是相同的,即釋放線程以使其能夠執(zhí)行其他進(jìn)程。

ASMX 處理程序調(diào)用服務(wù)器的 BeginXXX 函數(shù)后,會(huì)將線程返回到進(jìn)程線程池,使之能夠處理接收到的任何其他請(qǐng)求。但是,還不能釋放請(qǐng)求的 HttpContext。ASMX 處理程序?qū)⒌却钡剿鼈鬟f給 BeginXXX 函數(shù)的回調(diào)函數(shù)被調(diào)用,它才結(jié)束處理請(qǐng)求。

一旦回調(diào)函數(shù)被調(diào)用,ASMX 處理程序?qū)⒄{(diào)用 EndXXX 函數(shù),使您的 Web 方法可以完成任何所要執(zhí)行的處理,并且可以得到被序列化到 SOAP 響應(yīng)中的返回?cái)?shù)據(jù)。EndXXX 函數(shù)返回后將發(fā)送響應(yīng),只有此時(shí)該請(qǐng)求的 HttpContext 才得到釋放。

簡(jiǎn)單的異步 Web 方法

為舉例說明異步 Web 方法,我從一個(gè)名為 LengthyProcedure 的簡(jiǎn)單同步 Web 方法開始,其代碼如下所示。然后我們?cè)倏匆豢慈绾萎惒酵瓿上嗤娜蝿?wù)。LengthyProcedure 只占用給定的毫秒數(shù)。

[WebService]

public class SyncWebService : System.Web.Services.WebService

{

[WebMethod]

public string LengthyProcedure(int milliseconds)

{

System.Threading.Thread.Sleep(milliseconds);

return "成功";

}

}

現(xiàn)在我們將 LengthyProcedure 轉(zhuǎn)換為異步 Web 方法。我們必須創(chuàng)建如前所述的 BeginLengthyProcedure 函數(shù)和 EndLengthyProcedure 函數(shù)。請(qǐng)記住,我們的 BeginLengthyProcedure 調(diào)用需要返回一個(gè) IAsyncResult 接口。這里,我打算使用一個(gè)委托以及該委托上的 BeginInvoke 方法,讓我們的 BeginLengthyProcedure 調(diào)用進(jìn)行異步方法調(diào)用。傳遞到 BeginLengthyProcedure 的回調(diào)函數(shù)將被傳遞到委托上的 BeginInvoke 方法,從 BeginInvoke 返回的 IAsyncResult 將被 BeginLengthyProcedure 方法返回。

當(dāng)委托完成時(shí),將調(diào)用 EndLengthyProcedure 方法。我們將調(diào)用委托上的 EndInvoke 方法,以傳入 IAsyncResult,并將其作為 EndLengthyProcedure 調(diào)用的輸入。返回的字符串將是從該 Web 方法返回的字符串。下面是其代碼:

[WebService]

public class AsyncWebService : System.Web.Services.WebService

{

public delegate string LengthyProcedureAsyncStub(

int milliseconds);

public string LengthyProcedure(int milliseconds)

{

System.Threading.Thread.Sleep(milliseconds);

return "成功";

}

public class MyState

{

public object previousState;

public LengthyProcedureAsyncStub asyncStub;

}

[ System.Web.Services.WebMethod ]

public IAsyncResult BeginLengthyProcedure(int milliseconds,

AsyncCallback cb, object s)

{

LengthyProcedureAsyncStub stub

= new LengthyProcedureAsyncStub(LengthyProcedure);

MyState ms = new MyState();

ms.previousState = s;

ms.asyncStub = stub;

return stub.BeginInvoke(milliseconds, cb, ms);

}

[ System.Web.Services.WebMethod ]

public string EndLengthyProcedure(IAsyncResult call)

{

MyState ms = (MyState)call.AsyncState;

return ms.asyncStub.EndInvoke(call);

}

}

何時(shí)采用異步 Web 方法

在確定是否適合在您的應(yīng)用程序中采用異步 Web 方法時(shí),有幾個(gè)問題需要考慮。首先,調(diào)用的 BeginXXX 函數(shù)必須返回一個(gè) IAsyncResult 接口。IAsyncResult 是從多個(gè)異步 I/O 操作返回的,這些操作包括訪問數(shù)據(jù)流、進(jìn)行 Microsoftreg; Windowsreg; 套接字調(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)用。不幸的是,目前 Microsoftreg; 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)用程序。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
成人精品一区二区三区免费| 国产乱xxⅹxx国语对白| 中文字幕不卡| 国产在线第一页| 国产精品视频一区麻豆| 国产精品入口麻豆电影| 国产超碰在线观看| 免费观看久久久久| 国产美女在线一区二区三区| 国产人成高清视频观看| 伊人av免费在线观看| 久青青在线观看视频国产| 欧美视频免费一区二区三区| 中文字幕在线视频免费观看| 国产成人亚洲综合小说区| www.99色.com| 国产高潮av| 狠狠干婷婷色| 国产福利在线免费观看| 天天干天天摸| 精品国产一区二区三区四区阿崩 | 国产免费专区| 国产国产国产国产国产国产| 亚洲国产日韩成人综合天堂| 青草av在线| 97福利电影| 丁香综合五月| av二区三区| 午夜视频99| 欧美日韩亚洲第一页| 91黄色在线| 国产丝袜在线| 高清av中文在线字幕观看1| 一级二级在线观看| 69堂视频在线观看国产| 丁香综合五月| 丁香花在线电影小说观看 | 思思99精品视频在线观看| 国产精品久久在线| 国产一级激情| 最新超碰在线| 国产网站免费看| 天天av综合网| 天天操人人爽| 国产精品久久久久永久免费看| 国产乱在线观看视频| 波多野结衣中文字幕久久| 伊人影院蕉久影院在线播放| 精品国产高清a毛片无毒不卡| 国产对白国语对白| 精品视频一二区| 永久免费在线观看| 思思99精品视频在线观看| 青青久在线视频免费观看| 超碰在线观看免费版| 免费精品国产自产拍观看| 免费看的毛片| 国产精品视频福利一区二区| 国产videos| 亚洲成人av高清| 国产在线观看网站| 午夜国产福利在线| 国产福利免费在线观看| a视频免费看| 五月亚洲综合| 精品999视频| 久热中文字幕在线观看| 国产一区二区影视| 99久久国产视频| 老鸭窝av在线| 18激情网站| 九九在线观看免费视频| 国产成人综合亚洲欧美在| 日p在线观看| 国产黄色在线播放| 九九热免费在线视频| 国产成人夜间影院在线观看| 午夜影院在线免费观看| 国产小黄视频| 激情六月丁香| 日本福利在线| 永久免费在线观看| 国产盗摄精品一区二区酒店| 免费观看v片在线观看| 精品视频在线一区二区| 中文字幕免费中文| 九九99九九精彩| 欧美亚洲另类在线观看| 精品偷拍激情视频在线观看| 国产精品一区二区婷婷| www.大网伊人| 亚洲成人av高清| 国产成人午夜电影| 国产二区视频在线观看| 国产一级网站视频在线| 国产麻豆精品视频一区二区 | 亚洲色婷婷综合开心网| 国产成人精品综合网站| 最新天堂资源在线资源| 久草电影在线| 国产在线传媒| 欧美日韩性视频一区二区三区| 在线视频观看国产| av免费在线观| 人xxxx性xxxxx欧美| www在线观看播放免费视频日本| 在线一区二区三区精品| 精品国内一区二区三区免费视频| 国产黄色片在线观看| 91在线中文| 午夜影院在线免费观看| 日本高清中文字幕在线| 欧美黑人乱大交ⅹxxxxx| 女人色在线免费视频| 亚洲精品少妇久久久久久| 在线观看av的网站| 亚洲人av在线| 黄色片免费在线| 国产精品作爱| 精品卡一卡卡2卡3网站| eeuss影影院www在线播放| 免费看黄视频网站| 国产网站在线播放| 伊人色综合网| 国产美女被草| 在线国产一级| 1区2区视频| www555久久| 国产精品被窝福利一区| 丝袜理论片在线观看| 中文字幕不卡| 亚洲精品天堂在线| 国产一二区在线| 碰草在线视频| 中文在线官网天堂| 综合蜜桃精品| 狂野欧美性猛交xxxx乱大交| 99热免费观看| 国产日韩精品在线看| 日本高清不卡中文字幕| 69久久久久| 国产精品久久在线| 国产原创在线播放| www.av在线| 日本高清中文字幕二区在线| 国产极品一区二区三区| 白浆爆出在线观看| 在线视频观看国产| 国产精品福利视频一区二区三区| 麻豆电影传媒二区| 日本福利在线| 日本片在线看| a视频在线观看免费| av日韩国产| 午夜影院在线免费观看| 国产黄色av免费看| 国产激情视频一区二区| 国产性网软件大全| 国产精品麻豆一区二区三区| 国产视频福利| 国产99re66在线视频| 国产午夜三区视频在线| 最近高清中文在线字幕在线观看| 好男人免费精品视频| 久蕉依人在线视频| 好看的中文字幕在线播放| 国产中文字幕在线视频| 福利视频网站导航| 国产三级免费观看| 国产91在线视频蝌蚪| 亚洲综合在线不卡| 超碰国产在线观看| 国产毛片在线看| 国产黄色网页| 性色视频在线| 国产乱妇乱子在线播视频播放网站 | 18成年在线观看| 在线国产1区| www.99色.com| 最近中文字幕mv免费高清视频8| 最新国产在线精品91尤物| 国产高清一区二区三区视频| 伊人免费视频| 国产美女视频一区二区三区| 国产免费一级| 精品免费视频一卡2卡三卡4卡不卡| 国产亚av手机在线观看| 在线视频三级| 五月综合激情在线| 在线国产福利网站| 国产美女av在线| 精品999视频| 免费一区二区在线观看| 青青草中文字幕| 国产亚洲精品久久久久久青梅| 亚洲天堂影院在线观看| 国产中文字幕在线看| 91资源在线观看| gogo高清在线播放免费| 国产亚av手机在线观看|