次の方法で共有


二連式

二重のサンプルでは、二重コントラクトを定義して実装する方法を示します。 双方向通信は、クライアントがサービスとのセッションを確立し、サービスがクライアントにメッセージを送信できるチャネルをサービスに提供するときに発生します。 このサンプルは、入門に基づいています。 双方向コントラクトは、インターフェイスのペア (クライアントからサービスへのプライマリ インターフェイス、およびサービスからクライアントへのコールバック インターフェイス) として定義されます。 このサンプルでは、 ICalculatorDuplex インターフェイスを使用すると、クライアントは算術演算を実行し、セッションで結果を計算できます。 サービスは、 ICalculatorDuplexCallback インターフェイスで結果を返します。 コンテキストを確立して、クライアントとサービスの間で送信される一連のメッセージを相互に関連付ける必要があるため、二重のコントラクトにはセッションが必要です。

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

このサンプルでは、クライアントはコンソール アプリケーション (.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}");
        equation = result.ToString();
    }

    public void AddTo(double n)
    {
        result += n;
        equation += $" + {n}";
        Callback.Result(result);
    }

    //...

    ICalculatorDuplexCallback Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }
    }
}

クライアントは、サービスからメッセージを受信するために、双方向コントラクトのコールバック インターフェイスを実装するクラスを提供する必要があります。 このサンプルでは、ICalculatorDuplexCallback インターフェイスを実装するためにCallbackHandler クラスが定義されています。

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

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

双方向コントラクトに対して生成されるプロキシでは、構築時に 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 接続は、方向ごとに 1 つずつ提供されます。 サービスでは、構成の唯一の違いは、使用されるバインディングです。 クライアントでは、次のサンプル構成に示すように、サーバーがクライアントへの接続に使用できるアドレスを構成する必要があります。

<client>
  <endpoint name=""
            address="http://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="http://localhost:8000/myClient/">
    </binding>
  </wsDualHttpBinding>
</bindings>

サンプルを実行すると、サービスから送信されるコールバック インターフェイスでクライアントに返されるメッセージが表示されます。 各中間結果が表示され、すべての操作の完了時に数式全体が表示されます。 Enter キーを押してクライアントをシャットダウンします。

サンプルを設定、ビルド、実行するには

  1. Windows Communication Foundation サンプル One-Time セットアップ手順を実行していることを確認します。

  2. ソリューションの C#、C++、または Visual Basic .NET エディションをビルドするには、「 Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。

    Von Bedeutung

    クロスマシン構成でクライアントを実行する場合は、次に示すように、<client> 要素の <endpoint> のaddress属性と、<wsDualHttpBind>ing> 要素の <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>