WCF單向協定基本創建步驟解析
WCF開發工具的出現,幾乎整合了.NET平臺下所有的技術,為開發人員帶來了非常大的好處。我們今天將會通過這篇文章介紹的內容充分的了解到有關WCF單向協定的相關創建方法,希望對大家有所幫助。#t#
創建WCF單向協定
通過將 ServiceContractAttribute 類應用到定義服務將要實現的方法的接口,創建服務協定。
通過將 OperationContractAttribute 類應用到相應的方法,指示客戶端可以調用接口中的哪些方法。
通過將 IsOneWay 屬性設置為 true,可將不得具有輸出(沒有返回值且沒有 out 參數或 ref 參數)的操作指定為單向操作。注意,默認情況下,使用 OperationContractAttribute 類的操作都滿足請求-答復協定,原因是默認情況下 IsOneWay 屬性為 false。因此,如果需要對方法使用WCF單向協定,則必須將 attribute 屬性的值顯式指定為 true。
此示例演示具有單向服務操作的服務協定。客戶端不會像在雙向服務操作中那樣等待服務操作完成。此示例基于入門示例并使用 wsHttpBinding 綁定。此示例中的服務是自承載控制臺應用程序,通過它可以觀察接收和處理請求的服務。客戶端也是一個控制臺應用程序。
注意:
本主題的末尾介紹了此示例的設置過程和生成說明。
若要創建單向服務協定,請定義服務協定,將 OperationContractAttribute 類應用于每個操作,并將 IsOneWay 設置為 true,如下面的示例代碼所示:
- [ServiceContract(Namespace="http://Microsoft.
ServiceModel.Samples")]- public interface IOneWayCalculator
- {
- [OperationContract(IsOneWay=true)]
- void Add(double n1, double n2);
- [OperationContract(IsOneWay = true)]
- void Subtract(double n1, double n2);
- [OperationContract(IsOneWay = true)]
- void Multiply(double n1, double n2);
- [OperationContract(IsOneWay = true)]
- void Divide(double n1, double n2);
- }
為了演示客戶端不會等待服務操作完成,此示例中的服務代碼實現了五秒鐘的延遲,如下面的示例代碼所示:
- / This service class implements the service contract.
- // This code writes output to the console window.
- [ServiceBehavior(ConcurrencyModeConcurrencyMode =
ConcurrencyMode.Multiple, InstanceContextModeInstanceContextMode
= InstanceContextMode.PerCall)]- public class CalculatorService : IOneWayCalculator
- {
- public void Add(double n1, double n2)
- {
- Console.WriteLine("Received Add({0},{1}) - sleeping", n1, n2);
- System.Threading.Thread.Sleep(1000 * 5);
- double result = n1 + n2;
- Console.WriteLine("Processing Add({0},{1}) - result:
{2}", n1, n2, result);- }
- ...
- }
當客戶端調用服務時,調用不等待服務操作完成即返回。
運行示例時,客戶端和服務活動將顯示在服務和客戶端控制臺窗口中。您可以看到服務從客戶端接收消息。在每個控制臺窗口中按 Enter 可以同時關閉服務和客戶端。
客戶端在服務之前完成,說明了客戶端沒有等待單向服務操作完成。客戶端輸出如下所示:
- Add(100,15.99)
- Subtract(145,76.54)
- Multiply(9,81.25)
- Divide(22,7)
- Press < ENTER> to terminate client.
服務輸出如下所示:
- The service is ready.
- Press < ENTER> to terminate service.
- Received Add(100,15.99) - sleeping
- Received Subtract(145,76.54) - sleeping
- Received Multiply(9,81.25) - sleeping
- Received Divide(22,7) - sleeping
- Processing Add(100,15.99) - result: 115.99
- Processing Subtract(145,76.54) - result: 68.46
- Processing Multiply(9,81.25) - result: 731.25
- Processing Divide(22,7) - result: 3.14285714285714
在進行WCF單向協定時,需要注意:
HTTP 從定義上講是一個請求/響應協議;當發出請求時,即返回響應。即使對于通過 HTTP 公開的單向服務操作,也是如此。當調用操作時,服務在執行服務操作之前返回 HTTP 狀態碼 202。此狀態碼表示請求已被接受進行處理,但處理尚未完成。調用操作的客戶端在從服務收到 202 響應之前處于阻止狀態。當使用綁定(配置為使用會話)發送多個單向消息時,這可能會產生某些意外行為。此示例中使用的 wsHttpBinding 綁定配置為默認使用會話來建立安全上下文。默認情況下,會話中的消息一定會按照它們的發送順序到達。因此,當發送會話中的第二個消息時,在處理完***個消息之前不會處理第二個消息。這樣的結果是,在處理完上一個消息之前,客戶端不會收到消息的 202 響應。因此,客戶端似乎是阻止了每個后續的操作調用。為了避免此行為,此示例對運行庫進行了配置,以便將消息并發調度給不同的實例進行處理。此示例將 InstanceContextMode 設置為 PerCall,使每個消息可以由不同的實例來處理。ConcurrencyMode 設置為 Multiple,以允許多個線程同時調度消息。