Sdílet prostřednictvím


Duplex

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 ICalculatorDuplex rozhraní umožňuje klientovi provádět matematické operace a vypočítat výsledek v rámci 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á Internetová informační služba (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 CallbackHandler je třída 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 InstanceContext poskytnutí při konstrukci. Používá InstanceContext se jako lokalita pro objekt, který implementuje rozhraní zpětného volání a zpracovává zprávy odeslané zpět ze služby. Vytvoří se InstanceContext s instancí CallbackHandler třídy. 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 vazbu, která podporuje komunikaci relace i duplexní komunikaci. Podporuje wsDualHttpBinding komunikaci relací a umožňuje duplexní komunikaci tím, že poskytuje duální připojení HTTP, jedno 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 vrátí klientovi v rozhraní zpětného volání odeslaného ze služby. 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.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  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 s jedním nebo více počítači, postupujte podle pokynů v části 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>