Bagikan melalui


Dupleks

Sampel dupleks menunjukkan cara mendefinisikan dan mengimplementasikan kontrak dupleks. Komunikasi dupleks terjadi ketika klien membuat sesi dengan layanan dan memberikan layanan saluran di mana layanan dapat mengirim pesan kembali ke klien. Sampel ini berdasarkan Memulai. Kontrak dupleks didefinisikan sebagai pasangan antarmuka—antarmuka utama dari klien ke layanan dan antarmuka panggilan balik dari layanan ke klien. Dalam sampel ini, antarmuka ICalculatorDuplex memungkinkan klien melakukan operasi matematika, menghitung hasil selama sesi. Layanan menampilkan hasil pada antarmuka ICalculatorDuplexCallback. Kontrak dupleks memerlukan sesi, karena konteks harus dibuat untuk menghubungkan kumpulan pesan yang dikirim antara klien dan layanan.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan di-hosting oleh Layanan Informasi Internet (IIS). Kontrak dupleks didefinisikan sebagai berikut:

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

Kelas CalculatorService mengimplementasikan antarmuka ICalculatorDuplex utama. Layanan menggunakan mode instans PerSession untuk mempertahankan hasil untuk setiap sesi. Properti privat bernama Callback digunakan untuk mengakses saluran panggilan balik ke klien. Layanan menggunakan panggilan balik untuk mengirim pesan kembali ke klien melalui antarmuka panggilan balik.

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

Klien harus menyediakan kelas yang mengimplementasikan antarmuka panggilan balik dari kontrak dupleks, untuk menerima pesan dari layanan. Dalam sampel, kelas CallbackHandler ditentukan untuk mengimplementasikan antarmuka 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);
   }
}

Proksi yang dihasilkan untuk kontrak dupleks memerlukan InstanceContext yang harus disediakan saat konstruksi. InstanceContext ini digunakan sebagai situs untuk objek yang mengimplementasikan antarmuka panggilan balik dan menangani pesan yang dikirim kembali dari layanan. InstanceContext dibuat dengan instans kelas CallbackHandler. Objek ini menangani pesan yang dikirim dari layanan ke klien pada antarmuka panggilan balik.

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

Konfigurasi telah dimodifikasi untuk memberikan pengikatan yang mendukung baik komunikasi sesi maupun komunikasi dupleks. wsDualHttpBinding mendukung komunikasi sesi dan memungkinkan komunikasi dupleks dengan menyediakan koneksi HTTP ganda, satu untuk setiap arah. Pada layanan, satu-satunya perbedaan dalam konfigurasi adalah pengikatan yang digunakan. Pada klien, Anda harus mengonfigurasi alamat yang dapat digunakan server untuk terhubung ke klien seperti yang ditunjukkan dalam konfigurasi sampel berikut.

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

Saat Anda menjalankan sampel, Anda melihat pesan yang ditampilkan ke klien pada antarmuka panggilan balik yang dikirim dari layanan. Setiap hasil perantara ditampilkan, diikuti oleh seluruh persamaan setelah penyelesaian semua operasi. Tekan ENTER untuk mematikan komputer klien.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C#, C++, atau Visual Basic .NET, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.

    Penting

    Saat menjalankan komputer klien pada konfigurasi lintas komputer, pastikan untuk mengganti "localhost" pada atribut address dari <titik akhir> elemen <klien> dan atribut clientBaseAddress elemen <pengikatan> dari elemen <wsDualHttpBinding> dengan nama komputer yang sesuai, seperti yang ditunjukkan berikut ini:

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