Share via


Çift Yönlü

Çift yönlü örnek, çift yönlü sözleşme tanımlamayı ve uygulamayı gösterir. Çift yönlü iletişim, istemci bir hizmetle oturum oluşturduğunda ve hizmete hizmetin istemciye ileti gönderebileceği bir kanal verdiğinde gerçekleşir. Bu örnek, Başlarken'i temel alır. Çift yönlü anlaşma, istemciden hizmete birincil arabirim ve hizmetten istemciye geri çağırma arabirimi olan arabirim çifti olarak tanımlanır. Bu örnekte arabirim, ICalculatorDuplex istemcinin bir oturum üzerinden sonucu hesaplayarak matematik işlemleri gerçekleştirmesine olanak tanır. Hizmet, arabirimde ICalculatorDuplexCallback sonuçları döndürür. İstemci ile hizmet arasında gönderilen ileti kümesini ilişkilendirmek için bir bağlam oluşturulması gerektiğinden çift yönlü sözleşme oturum gerektirir.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Bu örnekte istemci bir konsol uygulamasıdır (.exe) ve hizmet Internet Information Services (IIS) tarafından barındırılır. Çift yönlü sözleşme aşağıdaki gibi tanımlanır:

[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 sınıfı birincil ICalculatorDuplex arabirimini uygular. Hizmet, her oturum için PerSession sonucu korumak için örnek modunu kullanır. adlı Callback özel bir özellik, istemciye geri çağırma kanalına erişmek için kullanılır. Hizmet, geri çağırma arabirimi aracılığıyla istemciye ileti göndermek için geri çağırmayı kullanır.

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

İstemci, hizmetten ileti almak için çift yönlü sözleşmenin geri çağırma arabirimini uygulayan bir sınıf sağlamalıdır. Örnekte, arabirimini uygulamak ICalculatorDuplexCallback için bir CallbackHandler sınıf tanımlanır.

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

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

Çift yönlü sözleşme için oluşturulan ara sunucu, inşaat sırasında sağlanmasını InstanceContext gerektirir. Bu InstanceContext , geri çağırma arabirimini uygulayan ve hizmetten geri gönderilen iletileri işleyen bir nesnenin sitesi olarak kullanılır. , InstanceContext sınıfının bir örneğiyle CallbackHandler oluşturulur. Bu nesne, hizmetten istemciye geri çağırma arabiriminde gönderilen iletileri işler.

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

Yapılandırma, hem oturum iletişimini hem de çift yönlü iletişimi destekleyen bir bağlama sağlayacak şekilde değiştirildi. , oturum iletişimini wsDualHttpBinding destekler ve her yön için bir tane olan çift HTTP bağlantıları sağlayarak çift yönlü iletişime izin verir. Hizmette yapılandırmadaki tek fark kullanılan bağlamadır. İstemcide, aşağıdaki örnek yapılandırmada gösterildiği gibi sunucunun istemciye bağlanmak için kullanabileceği bir adres yapılandırmanız gerekir.

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

Örneği çalıştırdığınızda, hizmetten gönderilen geri çağırma arabiriminde istemciye döndürülen iletileri görürsünüz. Her ara sonuç görüntülenir ve ardından tüm işlemler tamamlandıktan sonra denklemin tamamı görüntülenir. İstemciyi kapatmak için ENTER tuşuna basın.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C#, C++ veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığı altındaki yönergeleri izleyin.

  3. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

    Önemli

    İstemciyi makineler arası yapılandırmada çalıştırırken, aşağıda gösterildiği gibi hem istemci öğesinin clientBaseAddress uç noktasının <><özniteliğinde hem de address wsDualHttpBinding> öğesinin bağlama> öğesinin< özniteliğindeki< "localhost" değerini uygun makinenin adıyla değiştirdiğinizden emin olun:>

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