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.
Di aplikasi Windows Communication Foundation (WCF), sesi menghubungkan sekelompok pesan ke dalam percakapan. Sesi WCF berbeda dari objek sesi yang tersedia dalam aplikasi ASP.NET, mendukung perilaku yang berbeda, dan dikontrol dengan cara yang berbeda. Topik ini menjelaskan fitur yang diaktifkan sesi dalam aplikasi WCF dan cara menggunakannya.
Sesi di Aplikasi Windows Communication Foundation
Ketika kontrak layanan menentukan bahwa ia memerlukan sesi, kontrak tersebut menentukan bahwa semua panggilan (yaitu, pertukaran pesan yang mendasar yang mendukung panggilan) harus menjadi bagian dari percakapan yang sama. Jika kontrak menentukan bahwa kontrak memungkinkan sesi tetapi tidak memerlukannya, klien dapat terhubung dan membuat sesi atau tidak membuat sesi. Jika sesi berakhir dan pesan dikirim melalui saluran yang sama, hal itu menimbulkan pengecualian.
Sesi WCF memiliki fitur konseptual utama berikut:
Mereka secara eksplisit dimulai dan dihentikan oleh aplikasi panggilan (klien WCF).
Pesan yang dikirimkan selama sesi diproses sesuai urutan penerimaannya.
Sesi menghubungkan sekelompok pesan ke dalam percakapan. Berbagai jenis korelasi dimungkinkan. Misalnya, satu saluran berbasis sesi dapat menghubungkan pesan berdasarkan koneksi jaringan bersama sementara saluran berbasis sesi lain dapat menghubungkan pesan berdasarkan tag bersama di isi pesan. Fitur yang dapat berasal dari sesi tergantung pada sifat korelasi.
Tidak ada penyimpanan data umum yang terkait dengan sesi WCF.
Jika Anda terbiasa dengan System.Web.SessionState.HttpSessionState kelas dalam aplikasi ASP.NET dan fungsionalitas yang disediakannya, Anda mungkin melihat perbedaan berikut antara sesi semacam itu dan sesi WCF:
ASP.NET sessions selalu dihasilkan oleh server.
ASP.NET sesi secara implisit tidak diurutkan.
Sesi ASP.NET menyediakan mekanisme penyimpanan data umum di seluruh permintaan web.
Topik ini menjelaskan:
Perilaku eksekusi default saat menggunakan pengikatan berbasis sesi di lapisan model layanan.
Jenis fitur yang disediakan oleh pengikatan berbasis sesi WCF yang dikelola oleh sistem.
Cara membuat kontrak yang mendeklarasikan persyaratan sesi.
Cara memahami dan mengontrol pembuatan dan penghentian sesi dan hubungan sesi dengan instans layanan.
Perilaku Eksekusi Bawaan Menggunakan Sesi
Pengikatan yang mencoba memulai sesi disebut pengikatan berbasis sesi . Kontrak layanan menentukan bahwa mereka memerlukan, mengizinkan, atau menolak pengikatan yang berbasis sesi dengan mengatur ServiceContractAttribute.SessionMode properti pada antarmuka kontrak layanan (atau kelas) ke salah satu nilai System.ServiceModel.SessionMode enumerasi. Secara default, nilai properti ini adalah Allowed, yang berarti bahwa jika klien menggunakan pengikatan berbasis sesi dengan implementasi layanan WCF, layanan menetapkan dan menggunakan sesi yang disediakan.
Saat layanan WCF menerima sesi klien, fitur berikut diaktifkan secara default:
Semua panggilan antara objek klien WCF ditangani oleh instans layanan yang sama.
Pengikatan berbasis sesi yang berbeda menyediakan fitur tambahan.
Jenis Sesi System-Provided
Pengikatan berbasis sesi mendukung asosiasi default instans layanan dengan sesi tertentu. Namun, pengikatan berbasis sesi yang berbeda mendukung fitur yang berbeda selain mengaktifkan kontrol instancing berbasis sesi yang dijelaskan sebelumnya.
WCF menyediakan jenis perilaku aplikasi berbasis sesi berikut:
Mendukung sesi berbasis keamanan, di mana kedua pihak komunikasi telah menyetujui percakapan aman tertentu. Untuk informasi selengkapnya, lihat Mengamankan Layanan. Misalnya, ikatan System.ServiceModel.WSHttpBinding, yang mendukung sesi keamanan dan sesi yang andal, secara default hanya menggunakan sesi aman yang mengenkripsi dan menandatangani pesan secara digital.
Pengikatan System.ServiceModel.NetTcpBinding mendukung sesi berbasis TCP/IP untuk memastikan bahwa semua pesan berkorelasi dengan koneksi di tingkat soket.
Elemen System.ServiceModel.Channels.ReliableSessionBindingElement , yang mengimplementasikan spesifikasi WS-ReliableMessaging, memberikan dukungan untuk sesi yang andal di mana pesan dapat dikonfigurasi untuk dikirimkan secara berurutan dan tepat sekali, memastikan pesan diterima bahkan ketika pesan bepergian di beberapa simpul selama percakapan. Untuk informasi selengkapnya, lihat Reliable Sessions.
Pengikatan System.ServiceModel.NetMsmqBinding menyediakan sesi datagram MSMQ. Untuk informasi selengkapnya, lihat Antrean di WCF.
Mengatur properti SessionMode tidak menentukan jenis sesi yang diperlukan kontrak, hanya menetapkan bahwa sesi dibutuhkan.
Membuat Kontrak yang Memerlukan Sesi
Membuat kontrak yang memerlukan sesi menyatakan bahwa grup operasi yang dinyatakan kontrak layanan semuanya harus dijalankan dalam sesi yang sama dan pesan tersebut harus dikirimkan secara berurutan. Untuk menentukan level dukungan sesi yang diperlukan oleh kontrak layanan, atur properti ServiceContractAttribute.SessionMode pada antarmuka atau kelas kontrak layanan Anda ke nilai enumerasi System.ServiceModel.SessionMode untuk menetapkan apakah kontrak:
Membutuhkan sesi.
Memungkinkan klien untuk membuat sesi.
Melarang sesi komputer.
Namun, pengaturan SessionMode properti tidak menentukan jenis perilaku berbasis sesi yang diperlukan kontrak. Ini menginstruksikan WCF untuk mengonfirmasi pada runtime bahwa pengikatan yang dikonfigurasi (yang membuat saluran komunikasi) untuk layanan dapat, tidak dapat, atau mungkin dapat membuat sesi saat menerapkan layanan. Sekali lagi, pengikatan dapat memenuhi persyaratan tersebut dengan semua jenis perilaku berbasis sesi yang dipilihnya—keamanan, transportasi, andal, atau beberapa kombinasi. Perilaku yang tepat tergantung pada nilai yang System.ServiceModel.SessionMode dipilih. Jika pengikatan layanan yang dikonfigurasi tidak sesuai dengan nilai SessionMode, pengecualian akan dilemparkan. Pengikatan dan saluran yang mereka buat yang mendukung sesi dikatakan berbasis sesi.
Kontrak layanan berikut menentukan bahwa semua operasi dalam ICalculatorSession harus ditukar dalam satu sesi. Tidak ada operasi yang mengembalikan nilai ke pemanggil kecuali Equals metode . Namun, metode ini Equals tidak mengambil parameter dan, oleh karena itu, hanya dapat mengembalikan nilai non-nol di dalam sesi di mana data telah diteruskan ke operasi lain. Kontrak ini memerlukan sesi untuk berfungsi dengan baik. Tanpa sesi yang terkait dengan klien tertentu, instans layanan tidak memiliki cara untuk mengetahui data sebelumnya yang telah dikirim klien ini.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[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);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
Jika layanan mengizinkan sesi, maka sesi dibuat dan digunakan jika klien memulainya; jika tidak, tidak ada sesi yang dibuat.
Sesi dan Instans Layanan
Jika Anda menggunakan perilaku instancing default di WCF, semua panggilan antara objek klien WCF ditangani oleh instans layanan yang sama. Oleh karena itu, pada tingkat aplikasi, Anda dapat menganggap sesi sebagai mengaktifkan perilaku aplikasi yang mirip dengan perilaku panggilan lokal. Misalnya, saat Anda membuat objek lokal:
Konstruktor dipanggil.
Semua panggilan berikutnya yang dilakukan ke referensi objek klien WCF diproses oleh instans objek yang sama.
Destruktor dipanggil ketika referensi objek dihancurkan.
Sesi memungkinkan perilaku serupa antara klien dan layanan selama perilaku instans layanan default digunakan. Jika kontrak layanan memerlukan atau mendukung sesi, satu atau beberapa operasi kontrak dapat ditandai sebagai memulai atau mengakhiri sesi dengan mengatur properti IsInitiating dan IsTerminating.
Operasi yang memulai adalah operasi yang harus dilakukan sebagai operasi pertama dalam sesi baru. Operasi non-inisiasi hanya dapat dipanggil setelah setidaknya satu operasi inisiasi dipanggil. Oleh karena itu, Anda dapat membuat semacam konstruktor sesi untuk layanan Anda dengan menyatakan memulai operasi yang dirancang untuk mengambil input dari klien yang sesuai dengan awal instans layanan. (Status dikaitkan dengan sesi, namun, dan bukan objek layanan.)
Mengakhiri operasi, sebaliknya, adalah operasi yang harus dipanggil sebagai pesan terakhir dalam sesi yang ada. Dalam kasus default, WCF mendaur ulang objek layanan dan konteksnya setelah sesi yang terkait dengan layanan ditutup. Oleh karena itu, Anda dapat membuat semacam destruktor dengan menyatakan penghentian operasi yang dirancang untuk melakukan fungsi yang sesuai dengan akhir instans layanan.
Nota
Meskipun perilaku default memiliki kemiripan dengan konstruktor dan destruktor lokal, itu hanya kesamaan. Setiap operasi layanan WCF dapat menjadi operasi memulai atau mengakhiri, atau keduanya pada saat yang sama. Selain itu, dalam kasus default, memulai operasi dapat dipanggil berapa kali dalam urutan apa pun; tidak ada sesi tambahan yang dibuat setelah sesi dibuat dan dikaitkan dengan instans kecuali Anda secara eksplisit mengontrol masa pakai instans layanan (dengan memanipulasi System.ServiceModel.InstanceContext objek). Terakhir, status dikaitkan dengan sesi dan bukan objek layanan.
Misalnya, kontrak yang ICalculatorSession digunakan dalam contoh sebelumnya mengharuskan objek klien WCF terlebih dahulu memanggil operasi Clear sebelum operasi lainnya, dan bahwa sesi dengan objek klien WCF ini harus berakhir ketika memanggil operasi Equals. Contoh kode berikut menunjukkan kontrak yang memberlakukan persyaratan ini.
Clear harus dipanggil terlebih dahulu untuk memulai sesi, dan sesi tersebut berakhir ketika Equals dipanggil.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
Layanan tidak memulai sesi dengan klien. Dalam aplikasi klien WCF, hubungan langsung ada antara masa pakai saluran berbasis sesi dan masa pakai sesi itu sendiri. Dengan demikian, klien membuat sesi baru dengan membentuk saluran berbasis sesi baru dan mengakhiri sesi yang ada dengan menutup saluran berbasis sesi dengan cara yang baik. Klien memulai sesi dengan titik akhir layanan dengan memanggil salah satu hal berikut ini:
ICommunicationObject.Open pada saluran yang dikembalikan oleh panggilan ke ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Open pada objek klien WCF yang dihasilkan oleh ServiceModel Metadata Utility Tool (Svcutil.exe).
Operasi memulai pada salah satu jenis objek klien WCF (secara default, semua operasi dimulai). Ketika operasi pertama dipanggil, objek klien WCF secara otomatis membuka saluran dan memulai sesi.
Biasanya klien mengakhiri sesi dengan titik akhir layanan dengan memanggil salah satu hal berikut:
ICommunicationObject.Close pada saluran yang dikembalikan oleh panggilan ke ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close pada objek klien WCF yang dihasilkan oleh Svcutil.exe.
Operasi penghentian pada salah satu jenis objek klien WCF (secara default, tidak ada operasi yang berakhir; kontrak harus secara eksplisit menentukan operasi penghentian). Ketika operasi pertama dipanggil, objek klien WCF secara otomatis membuka saluran dan memulai sesi.
Misalnya, lihat Cara: Membuat Layanan yang Memerlukan Sesi serta Perilaku Layanan Default dan sampel Instancing .
Untuk informasi selengkapnya tentang klien dan sesi, lihat Mengakses Layanan Menggunakan Klien WCF.
Sesi Berinteraksi dengan Pengaturan InstanceContext
Ada interaksi antara SessionMode enumerasi dalam kontrak dan ServiceBehaviorAttribute.InstanceContextMode properti, yang mengontrol hubungan antara saluran dan objek layanan tertentu. Untuk informasi selengkapnya, lihat Sesi, Instancing, dan Konkurensi.
Berbagi Objek InstanceContext
Anda juga dapat mengontrol saluran atau panggilan berbasis sesi mana yang terkait dengan objek mana InstanceContext dengan melakukan asosiasi itu sendiri.
Sesi dan Streaming
Ketika Anda memiliki sejumlah besar data untuk ditransfer, mode transfer streaming di WCF adalah alternatif yang layak untuk perilaku default buffering dan pemrosesan pesan dalam memori secara keseluruhan. Anda mungkin mendapatkan perilaku tak terduga saat melakukan streaming panggilan dengan pengikatan berbasis sesi. Semua panggilan streaming dilakukan melalui satu saluran (saluran datagram) yang tidak mendukung sesi bahkan jika pengikatan yang digunakan dikonfigurasi untuk menggunakan sesi. Jika beberapa klien melakukan panggilan streaming ke objek layanan yang sama melalui pengikatan berbasis sesi, dan mode konkurensi objek layanan diatur ke tunggal dan mode konteks instansnya diatur ke PerSession, semua panggilan harus melalui saluran datagram dan jadi hanya satu panggilan yang diproses pada satu waktu. Satu atau beberapa klien kemudian dapat kehabisan waktu. Anda dapat mengatasi masalah ini dengan mengatur objek InstanceContextMode layanan ke PerCall atau Konkurensi ke beberapa.
Nota
MaxConcurrentSessions tidak berpengaruh dalam kasus ini karena hanya ada satu "sesi" yang tersedia.