Bagikan melalui


Layanan Satu Arah

Perilaku default operasi layanan adalah pola permintaan-balasan. Dalam pola permintaan-balasan, klien menunggu pesan balasan, bahkan jika operasi layanan direpresentasikan dalam kode sebagai metode void. Dengan operasi satu arah, hanya satu pesan yang dikirimkan. Penerima tidak mengirim pesan balasan, pengirim juga tidak mengharapkannya.

Gunakan pola desain satu arah:

Ketika operasi satu arah, tidak ada pesan respons untuk membawa informasi kesalahan kembali ke klien. Anda dapat mendeteksi kondisi kesalahan dengan menggunakan fitur pengikatan yang mendasar, seperti sesi yang dapat diandalkan, atau dengan merancang kontrak layanan dupleks yang menggunakan dua operasi satu arah—kontrak satu arah dari klien ke layanan untuk memanggil operasi layanan dan kontrak satu arah lainnya antara layanan dan klien sehingga layanan dapat mengirim kembali kesalahan ke klien menggunakan panggilan balik yang diimplementasikan oleh klien.

Untuk membuat kontrak layanan satu arah, tentukan kontrak layanan Anda, terapkan kelas OperationContractAttribute ke setiap operasi, dan atur properti IsOneWay ke true seperti yang ditunjukkan dalam kode sampel berikut.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface IOneWayCalculator  
{  
    [OperationContract(IsOneWay=true)]  
    void Add(double n1, double n2);  
    [OperationContract(IsOneWay = true)]  
    void Subtract(double n1, double n2);  
    [OperationContract(IsOneWay = true)]  
    void Multiply(double n1, double n2);  
    [OperationContract(IsOneWay = true)]  
    void Divide(double n1, double n2);  
}  

Untuk sampel lengkap, lihat sampel Satu Arah.

Pemblokiran Klien dengan Operasi Satu Arah

Penting untuk disadari bahwa sementara beberapa aplikasi satu arah kembali segera setelah data keluar ditulis ke koneksi jaringan, dalam beberapa skenario implementasi pengikatan atau layanan dapat menyebabkan klien WCF memblokir menggunakan operasi satu arah. Dalam aplikasi klien WCF, objek klien WCF tidak kembali hingga data keluar ditulis ke koneksi jaringan. Ini berlaku untuk semua pola pertukaran pesan, termasuk operasi satu arah; ini berarti bahwa setiap masalah yang menulis data ke transportasi mencegah klien kembali. Bergantung pada masalahnya, hasilnya bisa menjadi pengecualian atau penundaan pengiriman pesan ke layanan.

Misalnya, jika transportasi tidak dapat menemukan titik akhir, pengecualian System.ServiceModel.EndpointNotFoundException dimunculkan tanpa banyak penundaan. Namun, ada kemungkinan juga bahwa layanan tidak dapat membaca data dari kabel karena alasan tertentu, yang mencegah operasi pengiriman transportasi klien kembali. Dalam kasus ini, jika periode Binding.SendTimeout pada pengikatan transportasi klien terlampaui, System.TimeoutException dilemparkan—tetapi tidak sampai periode batas waktu terlampaui. Dimungkinkan juga untuk mengirimkan begitu banyak pesan di layanan sehingga layanan tersebut tidak dapat memprosesnya melewati titik tertentu. Dalam hal ini juga, klien satu arah memblokir hingga layanan dapat memproses pesan atau hingga pengecualian dilemparkan.

Variasi lain adalah situasi di mana properti layanan ServiceBehaviorAttribute.ConcurrencyMode diatur ke Single dan pengikatan menggunakan sesi. Dalam hal ini, dispatcher memberlakukan pemesanan pada pesan masuk (persyaratan sesi), yang mencegah pesan berikutnya dibaca dari jaringan sampai layanan telah memproses pesan sebelumnya untuk sesi tersebut. Sekali lagi, klien memblokir, tetapi apakah pengecualian terjadi bergantung pada apakah layanan dapat memproses data yang menunggu sebelum pengaturan waktu habis pada klien.

Anda dapat mengurangi beberapa masalah ini dengan menyisipkan buffer antara objek klien dan operasi pengiriman transportasi klien. Misalnya, menggunakan panggilan asinkron atau menggunakan antrean pesan dalam memori dapat memungkinkan objek klien untuk kembali dengan cepat. Kedua pendekatan dapat meningkatkan fungsionalitas, tetapi ukuran kumpulan utas dan antrean pesan masih memberlakukan batas.

Disarankan, sebagai gantinya, Anda memeriksa berbagai kontrol pada layanan serta pada klien, dan kemudian menguji skenario aplikasi Anda untuk menentukan konfigurasi terbaik di kedua sisi. Misalnya, jika penggunaan sesi memblokir pemrosesan pesan pada layanan, Anda dapat mengatur properti ServiceBehaviorAttribute.InstanceContextMode ke PerCall sehingga setiap pesan dapat diproses oleh instans layanan yang berbeda, dan mengatur ConcurrencyMode ke Multiple untuk memungkinkan lebih dari satu utas mengirim pesan sekaligus. Pendekatan lain adalah meningkatkan kuota baca layanan dan pengikatan klien.

Lihat juga