Duplexní

Duplexní ukázka ukazuje, jak definovat a implementovat duplexní kontrakt. Duplexní komunikace nastane, když klient vytvoří relaci se službou a poskytne službě kanál, na kterém může služba odesílat zprávy zpět klientovi. Tato ukázka je založená na začínáme. Duplexní kontrakt je definován jako dvojice rozhraní – primární rozhraní z klienta do služby a rozhraní zpětného volání ze služby do klienta. V této ukázce rozhraní ICalculatorDuplex umožňuje klientovi provádět matematické operace, přičemž výsledek se vypočítává v průběhu relace. Služba vrátí výsledky v ICalculatorDuplexCallback rozhraní. Duplexní kontrakt vyžaduje relaci, protože musí být vytvořen kontext pro korelaci sady zpráv odesílaných mezi klientem a službou.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

V této ukázce je klient konzolovou aplikací (.exe) a služba je hostovaná internetovou informační službou (IIS). Duplexní kontrakt je definován takto:

[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);
}

Třída CalculatorService implementuje primární ICalculatorDuplex rozhraní. Služba používá PerSession režim instance k zachování výsledku pro každou relaci. Privátní vlastnost s názvem Callback se používá pro přístup ke kanálu zpětného volání klientovi. Služba používá zpětné volání pro odesílání zpráv zpět klientovi prostřednictvím rozhraní zpětného volání.

[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>();
        }
    }
}

Klient musí poskytnout třídu, která implementuje rozhraní zpětného volání duplexního kontraktu pro příjem zpráv ze služby. V ukázce, je třída CallbackHandler definována pro implementaci ICalculatorDuplexCallback rozhraní.

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, který se generuje pro duplexní kontrakt, vyžaduje poskytnutí InstanceContext při konstrukci. Používá se InstanceContext jako místo pro objekt, který implementuje rozhraní zpětného volání a zpracovává zprávy odeslané zpět ze služby. InstanceContext je konstruován pomocí instance třídy CallbackHandler. Tento objekt zpracovává zprávy odeslané ze služby klientovi v rozhraní zpětného volání.

// 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();

Konfigurace byla upravena tak, aby poskytovala navázání, které podporuje jak relaci, tak duplexní komunikaci. Komunikaci relací wsDualHttpBinding podporuje a umožňuje duplexní komunikaci zajištěním duálního připojení HTTP, jednoho pro každý směr. Jediným rozdílem v konfiguraci ve službě je použitá vazba. V klientovi musíte nakonfigurovat adresu, kterou server může použít pro připojení k klientovi, jak je znázorněno v následující ukázkové konfiguraci.

<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>

Při spuštění ukázky se zobrazí zprávy, které se vrací klientovi prostřednictvím rozhraní zpětného volání poskytnutého službou. Zobrazí se každý zprostředkující výsledek následovaný celou rovnicí po dokončení všech operací. Stisknutím klávesy ENTER ukončete klienta.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud chcete sestavit edici C#, C++ nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.

    Důležité

    Při spuštění klienta v konfiguraci mezi počítači nezapomeňte nahradit "localhost" v address atributu <koncového bodu><elementu klienta> i clientBaseAddress atribut <elementu vazby><elementu wsDualHttpBinding> názvem příslušného počítače, jak je znázorněno v následujícím příkladu:

    <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>