Oneway 範例示範服務聯繫人與單向服務作業。 用戶端不會等候服務作業完成,就如同雙向服務作業的情況一樣。 此範例是以 入門指南為基礎, 並使用 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(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = 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
備註
根據定義,HTTP 是要求/回應通訊協定;提出要求時,會傳回回應。 即使是透過 HTTP 公開的單向服務作業也是如此。 呼叫作業時,服務會在執行服務作業之前傳回 HTTP 狀態代碼 202。 此狀態代碼表示已接受要求進行處理,但尚未完成處理。 呼叫操作的用戶端會被阻塞,直到收到來自服務的 202 回應為止。 當使用設定為使用會話的系結傳送多個單向訊息時,這可能會造成一些非預期的行為。
wsHttpBinding 系結在此範例中預設設定為使用 Session 以建立安全性內容。 根據預設,會話中的訊息保證會依傳送的順序抵達。 因此,傳送會話中的第二個訊息時,在處理第一個訊息之前,不會處理它。 結果是客戶端在前一則訊息處理完成之前,不會收到訊息的 202 回應。 因此,用戶端似乎在每次後續的操作呼叫時被封鎖。 為避免此行為,此範例會將運行時間設定為將訊息並行分派至不同的實例進行處理。 範例會設定 InstanceContextMode 為 PerCall ,讓每個訊息都可以由不同的實例處理。
ConcurrencyMode 設定為 Multiple,以允許多個線程同時分派訊息。
要設定、建置和執行範例,請執行以下步驟:
請確定您已針對 Windows Communication Foundation 範例 執行One-Time 安裝程式。
若要建置解決方案的 C# 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例 中中的指示。
若要在單一或跨計算機組態中執行範例,請遵循執行 Windows Communication Foundation 範例 中的指示。
備註
在執行用戶端之前,先執行服務,然後在關閉服務之前關閉用戶端。 當客戶端因為服務消失而無法完全關閉安全性會話時,這會避免用戶端例外狀況。