以非同步方式與 XML Web Service 通訊
本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.
與 Web 服務進行非同步通訊遵循 .NET Framework 所指定的兩個非同步方法引動過程設計模式。但在進入細節之前,請注意 Web 服務不一定要明確撰寫為處理非同步要求,才能進行非同步呼叫。
Wsdl.exe 和 .NET Framework 非同步設計模式
當 Web 服務描述語言工具 (Wsdl.exe) 產生用戶端 Proxy 類別來存取指定的 Web 服務時,它會提供 Proxy 類別兩個機制,來與每個 Web 服務方法進行非同步通訊。第一個機制是開始/結束模式。第二個機制是 .NET Framework 2.0 版中所提供的事件驅動非同步程式設計模式。如需搭配 Web 服務使用這些模式的簡短說明,請參閱下列各節。如需這兩個模式的完整詳細資訊,請參閱Asynchronous Programming Design Patterns。
開始/結束引動過程模式
Wsdl.exe 會為 Web 服務中發行的每個作業 (在 ASP.NET 中則是 Web 服務方法),建立三個方法。一個方法用於同步存取;另外兩個則用於非同步存取。即使只有 Web 服務方法的同步實作,也是如此。下表描述這三個方法:
Proxy 類別中的方法名稱 | 描述 |
---|---|
<NameOfWebServiceMethod> |
為一個名為 <NameOfWebServiceMethod> 的 Web 服務方法,同步傳送訊息。 |
Begin<NameOfWebServiceMethod> |
開始與一個名為 <NameOfWebServiceMethod> 的 Web 服務方法的非同步訊息通訊。用戶端會指示 Begin 方法,開始處理服務呼叫但立即傳回。傳回值不是 Web 服務方法指定的資料型別,而是實作 IAsyncResult 介面的型別。 |
End<NameOfWebServiceMethod> |
結束與一個名為 <NameOfWebServiceMethod> 的 Web 服務方法的非同步訊息通訊,傳回 Web 服務方法呼叫的結果值。 |
Begin 和 End 方法遵循 .NET Framework 非同步設計模式的命名慣例。此設計模式闡述,每個同步方法有兩個這樣命名的非同步方法。
如需範例,請試想 Web 服務類別 PrimeFactorizer 的 Web 服務方法使用下列簽章搜尋主要因素:
public long[] Factorize(long factorizableNum)
根據輸入,這類方法會花上相當長時間,才能完成處理。因此,這是何時應該讓 Web 服務用戶端非同步呼叫 Web 服務方法的好範例。
如果 Wsdl.exe 使用這個 Web 服務,做為產生用戶端 Proxy 程式碼的輸入 (使用 ASP.NET Web 服務的 ?wsdl 查詢字串),它會使用下列簽章產生方法:
public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)
使用回呼開始/結束模式,實作非同步方法呼叫的 Web 服務用戶端
用戶端如何知道何時要呼叫 End 方法呢?實作用戶端進行這方面的判斷,有兩個技巧,如 .NET Framework 所定義:
等候技巧:使用 WaitHandle 類別的其中一個方法,讓用戶端等候方法完成。
回呼技巧:將回呼函式傳入 Begin 方法,接著當方法完成處理時,呼叫它來擷取結果。
**注意:**不論用戶端選擇哪一種技巧來與 Web 服務進行非同步通訊,傳送和接收的 SOAP 訊息和透過同步 Proxy 方法產生的 SOAP 訊息都相同。也就是說,仍然只有一個 SOAP 要求和 SOAP 回應跨網路傳送及接收。Proxy 類別使用與用戶端呼叫 Begin 方法時所使用的不同執行緒,處理 SOAP 回應,來完成這項作業。因此,當 Proxy 類別在接收及處理 SOAP 回應時,用戶端可以在其執行緒上繼續執行其他工作。
使用開始/結束模式的等候技巧
WaitHandle 類別會實作支援等候同步物件收到信號的方法:WaitOne、WaitAny 和 WaitAll。同步物件收到信號,表示等候指定之資源的執行緒現在可以存取資源。Web 服務用戶端會透過 Begin method 方法所傳回 IAsyncResult 物件的 AsyncWaitHandle 屬性,來存取 WaitHandle 物件。
如需這個技巧的範例,請參閱 HOW TO:使用等候技術實作非同步 Web 服務用戶端。
使用開始/結束模式的回呼技巧
使用回呼技巧,回呼函式會實作 AsyncCallback 委派,強制下列簽章:
public void MethodName(IAsyncResult ar)
如需這個技巧的範例,請參閱 HOW TO:使用回呼技術實作非同步 Web 服務用戶端。
如果回呼需要同步處理/執行緒相似性內容,則會透過內容發送器基礎結構來分派。換言之,回呼可以針對此類內容,向其呼叫端執行非同步作業。這正是方法簽章單向限定詞的語意。這表示,任何此類方法呼叫都可以向呼叫端執行同步或非同步作業,而且當執行控制回到呼叫端時,呼叫端不能針對此類呼叫的完成做出任何假設。
在完成非同步作業之前,呼叫 End 方法會封鎖呼叫端。以 Begin 方法所傳回的相同 IAsyncResult 再次呼叫這個方法,此行為尚未定義。
使用事件驅動非同步模式的非同步 Web 服務用戶端
Multithreaded Programming with the Event-based Asynchronous Pattern引進新的非同步程式設計模型,這個模型會使用事件來處理回呼,讓您不需實作複雜的多執行緒程式碼,就可以更輕鬆地建置多執行緒應用程式。如需新的事件驅動非同步模型的概觀,請參閱Event-based Asynchronous Pattern Overview。如需使用新模型的用戶端實作的詳細資訊,請參閱 How to: Implement a Client of the Event-based Asynchronous Pattern。
如需使用事件驅動模式建置 Web 服務的做法,請參閱 HOW TO:使用 ASP.NET 2.0 實作事件驅動的非同步 Web 服務用戶端。
另請參閱
工作
HOW TO:使用等候技術實作非同步 Web 服務用戶端
HOW TO:使用回呼技術實作非同步 Web 服務用戶端
HOW TO:從 Web 服務用戶端發出非同步呼叫
概念
建置 XML Web Service 用戶端
使用 ASP.NET 建立之 XML Web Service 的設計方針