共用方式為


雙工

雙工範例示範如何定義和實作雙工合約。 用戶端建立與服務的工作階段,並提供服務所需的通道以供服務將訊息傳回用戶端,這個程序即是所謂的雙工通訊。 此範例是以使用者入門範例為基礎。 雙工合約被定義為一對介面,其中的主要介面從用戶端到服務,回呼介面從服務到用戶端。 在此範例中,ICalculatorDuplex 介面允許用戶端執行數學運算,透過工作階段執行結果。 服務傳回 ICalculatorDuplexCallback 介面上的結果。 雙工合約需要一個工作階段,因為必須建立內容,將用戶端與服務之間傳送的訊息關聯在一起。

ms752216.note(zh-tw,VS.100).gif注意:
此範例的安裝程序與建置指示位於本主題的結尾。

在這個範例中,用戶端是主控台應用程式 (.exe),而服務則是由網際網路資訊服務 (IIS) 所裝載。 雙工合約的定義如下:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,
                 CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
    [OperationContract(IsOneWay = true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
}

public interface ICalculatorDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void Result(double result);
    [OperationContract(IsOneWay = true)]
    void Equation(string eqn);
}

CalculatorService 類別會實作主要的 ICalculatorDuplex 介面。 服務會使用 PerSession 執行個體模式維持各工作階段的結果。 而名為 Callback 的私用屬性用於存取用戶端的回呼通道。 服務會使用回呼,以透過回呼介面將訊息傳回用戶端。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
    double result = 0.0D;
    string equation;

    public CalculatorService()
    {
        equation = result.ToString();
    }

    public void Clear()
    {
        Callback.Equation(equation + " = " + result.ToString());
        equation = result.ToString();
    }

    public void AddTo(double n)
    {
        result += n;
        equation += " + " + n.ToString();
        Callback.Result(result);
    }
    ...
    ICalculatorDuplexCallback Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }
    }
}

用戶端必須提供實作雙工合約回呼介面的類別,用於接收來自服務的訊息。 在範例中,定義 CallbackHandler 類別以實作 ICalculatorDuplexCallback 介面。

public class CallbackHandler : ICalculatorDuplexCallback
{
   public void Result(double result)
   {
      Console.WriteLine("Result({0})", result);
   }

   public void Equation(string equation)
   {
      Console.WriteLine("Equation({0}", equation);
   }
}

針對雙工合約所產生的 Proxy,會要求在建構時提供 InstanceContext。 這個 InstanceContext 會用來做為站台,讓物件實作回呼介面並處理服務傳回的訊息。 InstanceContext 是以 CallbackHandler 類別的執行個體所建構。 這個物件會處理回呼介面上,從服務傳回至用戶端的訊息。

// Construct InstanceContext to handle messages on callback interface.
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());

// Create a client.
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);

Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");
Console.WriteLine();

// Call the AddTo service operation.
double value = 100.00D;
client.AddTo(value);

// Call the SubtractFrom service operation.
value = 50.00D;
client.SubtractFrom(value);

// Call the MultiplyBy service operation.
value = 17.65D;
client.MultiplyBy(value);

// Call the DivideBy service operation.
value = 2.00D;
client.DivideBy(value);

// Complete equation.
client.Clear();

Console.ReadLine();

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

組態已經過修改,以提供同時支援工作階段通訊和雙工通訊的繫結。 wsDualHttpBinding 支援工作階段通訊,並且藉由提供雙重 HTTP 連接 (一個方向一個連接) 允許雙工通訊。 在服務上,組態中的唯一差異是所使用的繫結。 在用戶端上,您必須設定伺服器可用來連接用戶端的位址,如下面的範例組態中所示。

<client>
  <endpoint name=""
            address="https://localhost/servicemodelsamples/service.svc" 
            binding="wsDualHttpBinding" 
            bindingConfiguration="DuplexBinding" 
            contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />
</client>

<bindings>
  <!-- Configure a binding that support duplex communication. -->
  <wsDualHttpBinding>
    <binding name="DuplexBinding" 
             clientBaseAddress="https://localhost:8000/myClient/">
    </binding>
  </wsDualHttpBinding>
</bindings>

執行範例時,您會看到傳回用戶端的訊息,該用戶端位於從服務傳送出的回呼介面上。 顯示每個中繼結果,接著顯示在完成所有操作時的整個方程式。 按 ENTER 鍵關閉用戶端。

若要設定、建置及執行範例

  1. 請確定您已執行 Windows Communication Foundation 範例的單次安裝程序

  2. 若要建置方案的 C#、C++ 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。

  3. 若要在單一或跨電腦的組態中執行本範例,請遵循Running the Windows Communication Foundation Samples中的指示。

    ms752216.Important(zh-tw,VS.100).gif 注意:
    在跨電腦組態中執行用戶端時,請確定以適當電腦的名稱取代 endpoint 項目的 address 屬性和 wsDualHttpBinding 項目的 binding 項目之 clientBaseAddress 屬性中的 "localhost"。

    <client>
    <endpoint name = ""
    address="http://service_machine_name/servicemodelsamples/service.svc"
    ... />
    </client>
    ...
    <wsDualHttpBinding>
    <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/">
    </binding>
    </wsDualHttpBinding>
    
ms752216.Important(zh-tw,VS.100).gif 注意:
這些範例可能已安裝在您的電腦上。 請先檢查下列 (預設) 目錄,然後再繼續。

<InstallDrive>:\WF_WCF_Samples

如果此目錄不存在,請移至用於 .NET Framework 4 的 Windows Communication Foundation (WCF) 與 Windows Workflow Foundation (WF) 範例 (英文),以下載所有 Windows Communication Foundation (WCF) 和 WF 範例。 此範例位於下列目錄。

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Contract\Service\Duplex