Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel Dupleks menunjukkan cara menentukan dan mengimplementasikan kontrak dupleks. Komunikasi dupleks terjadi ketika klien membuat sesi dengan layanan dan memberi layanan saluran tempat layanan dapat mengirim pesan kembali ke klien. Sampel ini didasarkan pada Panduan Memulai. Kontrak dupleks didefinisikan sebagai sepasang antarmuka—antarmuka utama dari klien ke layanan dan antarmuka panggilan balik dari layanan ke klien. Dalam sampel ini, ICalculatorDuplex antarmuka memungkinkan klien untuk melakukan operasi matematika, menghitung hasilnya selama sesi. Layanan mengembalikan hasil pada ICalculatorDuplexCallback antarmuka. Kontrak dupleks memerlukan sesi, karena konteks harus dibuat untuk menghubungkan kumpulan pesan yang dikirim antara klien dan layanan.
Nota
Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.
Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan dihosting oleh Internet Information Services (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 utama ICalculatorDuplex. Layanan ini menggunakan mode instans PerSession untuk mempertahankan hasil untuk setiap sesi. Properti privat bernama Callback digunakan untuk mengakses saluran panggilan balik ke klien. Layanan ini 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 suatu kelas pemrograman yang mengimplementasikan antarmuka callback dari kontrak dupleks untuk menerima pesan dari layanan. Dalam sampel, CallbackHandler kelas didefinisikan untuk mengimplementasikan ICalculatorDuplexCallback antarmuka.
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 untuk disediakan saat konstruksi. Ini InstanceContext digunakan sebagai situs untuk objek yang mengimplementasikan antarmuka panggilan balik dan menangani pesan yang dikirim kembali dari layanan.
InstanceContext dibangun dengan instance dari 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 menyediakan pengikatan yang mendukung komunikasi sesi dan komunikasi dupleks.
wsDualHttpBinding mendukung komunikasi sesi dan memungkinkan komunikasi dupleks dengan menyediakan dua koneksi HTTP, masing-masing 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 menyambungkan 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 menjalankan sampel, Anda akan melihat pesan yang dikembalikan 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, mengompilasi, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Untuk membangun solusi edisi C#, C++, atau Visual Basic .NET, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.
Penting
Saat menjalankan klien dalam konfigurasi lintas komputer, pastikan untuk mengganti "localhost" pada atribut
address<endpoint> dari elemen <klien> dan atributclientBaseAddress<binding> dari elemen < 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>