Bagikan melalui


Menggunakan Sesi

Dalam aplikasi Windows Communication Foundation (WCF), sesi menghubungkan grup 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 WCF

Ketika kontrak layanan menentukan bahwa sesi dibutuhkan, kontrak tersebut menentukan bahwa semua panggilan (yaitu, pertukaran pesan yang mendasarinya yang mendukung panggilan) harus menjadi bagian dari percakapan yang sama. Jika kontrak menentukan bahwa sesi diizinkan tetapi tidak diperlukan, klien dapat terhubung dan membuat sesi atau tidak membuat sesi. Jika sesi berakhir dan pesan dikirim melalui saluran yang sama, pengecualian akan diberlakukan.

Sesi WCF memiliki fitur konseptual utama berikut:

  • Sesi WCF 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 bergantung pada sifat korelasi.

  • Tidak ada penyimpanan data umum yang terkait dengan sesi WCF.

Jika Anda terbiasa dengan kelas System.Web.SessionState.HttpSessionState dalam aplikasi ASP.NET dan fungsionalitas yang disediakannya, Anda mungkin melihat perbedaan berikut antara sesi semacam itu dan sesi WCF:

  • ASP.NET sesi selalu dimulai dengan server.

  • ASP.NET sesi secara implisit tidak diurutkan.

  • ASP.NET sesi menyediakan mekanisme penyimpanan data umum di seluruh permintaan.

Topik ini menjelaskan:

  • Perilaku eksekusi default saat menggunakan pengikatan berbasis sesi di lapisan model layanan.

  • Jenis fitur yang disediakan oleh pengikatan yang disediakan siste, berbasis sesi WCF.

  • Cara membuat kontrak yang menyatakan persyaratan sesi.

  • Cara memahami dan mengontrol pembuatan dan penghentian sesi dan hubungan sesi dengan instans layanan.

Perilaku Eksekusi Default Menggunakan Sesi

Pengikatan yang mencoba memulai sesi disebut pengikatan berbasis sesi. Kontrak layanan menentukan bahwa mereka memerlukan, mengizinkan, atau menolak pengikatan berbasis sesi dengan mengatur properti ServiceContractAttribute.SessionMode pada antarmuka kontrak layanan (atau kelas) ke salah satu nilai enumerasi System.ServiceModel.SessionMode. 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:

  1. Semua panggilan antara objek klien WCF ditangani oleh instans layanan yang sama.

  2. Pengikatan berbasis sesi yang berbeda menyediakan fitur tambahan.

Jenis Sesi yang Disediakan Sistem

Pengikatan berbasis sesi mendukung asosiasi default instans layanan dengan sesi tertentu. Namun, pengikatan berbasis sesi yang berbeda mendukung fitur yang berbeda selain mengaktifkan kontrol pembuatan instans berbasis sesi yang dijelaskan sebelumnya.

WCF menyediakan jenis perilaku aplikasi berbasis sesi berikut:

Mengatur properti SessionMode tidak menentukan jenis sesi yang diperlukan kontrak, hanya saja memerlukannya.

Membuat Kontrak yang Memerlukan Sesi

Membuat kontrak yang menyaratkan agar sesi menyatakan bahwa grup operasi yang dinyatakan oleh kontrak layanan semuanya harus dijalankan dalam sesi yang sama dan pesan tersebut harus dikirimkan secara berurutan. Untuk menegaskan tingkat dukungan sesi yang diperlukan kontrak layanan, atur properti ServiceContractAttribute.SessionMode pada antarmuka atau kelas kontrak layanan Anda ke nilai enumerasi System.ServiceModel.SessionMode untuk menentukan apakah kontrak:

  • Membutuhkan sesi.

  • Mengizinkan klien untuk membuat sesi.

  • Melarang sesi.

Namun, mengatur properti SessionMode tidak menentukan jenis perilaku berbasis sesi yang disyaratkan oleh kontrak. Langkah ini menginstruksikan WCF untuk mengonfirmasi pada waktu proses bahwa pengikatan yang dikonfigurasi (yang membuat saluran komunikasi) untuk layanan akan, tidak akan, atau dapat membuat sesi saat menerapkan layanan. Sekali lagi, pengikatan dapat memenuhi persyaratan tersebut dengan semua jenis perilaku berbasis sesi yang dipilihnya—keamanan, transportasi, keandalan, atau kombinasi di antaranya. Perilaku yang tepat tergantung pada nilai System.ServiceModel.SessionMode yang dipilih. Jika pengikatan layanan yang dikonfigurasi tidak sesuai dengan nilai SessionMode, pengecualian akan dilemparkan. Pengikatan dan saluran yang dibuat yang mendukung sesi disebut sebagai berbasis sesi.

Kontrak layanan berikut menentukan bahwa semua operasi dalam ICalculatorSession harus ditukar dalam sesi. Tidak ada operasi yang mengembalikan nilai ke pemanggil kecuali metode Equals. Namun, metode Equals ini tidak mengambil parameter dan, oleh karena itu, hanya dapat mengembalikan nilai bukan 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.

Instans Sesi dan Layanan

Jika Anda menggunakan perilaku pembuatan instans 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 mengaktifkan 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.

Memulai operasi adalah yang harus dipanggil sebagai operasi pertama sesi baru. Operasi non-awal hanya dapat dipanggil setelah setidaknya satu operasi awal telah 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. (Namun, status dikaitkan dengan sesi 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 mendeklarasikan operasi penghentian yang dirancang untuk melakukan fungsi yang sesuai dengan akhir instans layanan.

Catatan

Meskipun perilaku default memiliki kesan yang mirip dengan konstruktor dan destruktor lokal, perilaku tersebut hanya mirip. Setiap operasi layanan WCF dapat menjadi operasi yang memulai atau mengakhiri, atau keduanya secara bersamaan. Selain itu, dalam kasus default, operasi memulai dapat dipanggil berapa kali dalam urutan apa pun; tidak ada sesi tambahan yang dibuat setelah sesi ini dibuat dan dikaitkan dengan instans kecuali Anda secara eksplisit mengontrol masa pakai instans layanan (dengan memanipulasi objek System.ServiceModel.InstanceContext). Akhirnya, status dikaitkan dengan sesi dan bukan objek layanan.

Misalnya, kontrak ICalculatorSession yang digunakan dalam contoh sebelumnya mengharuskan objek klien WCF terlebih dahulu memanggil operasi Clear sebelum operasi lain 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, terdapat hubungan langsung antara masa pakai saluran berbasis sesi dan masa pakai sesi itu sendiri. Dengan demikian, klien membuat sesi baru dengan membuat saluran berbasis sesi baru dan meruntuhkan sesi yang ada dengan menutup saluran berbasis sesi dengan anggun. Klien memulai sesi dengan titik akhir layanan dengan memanggil salah satu hal berikut ini:

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

Terdapat interaksi antara enumerasi SessionMode dalam kontrak dan properti ServiceBehaviorAttribute.InstanceContextMode, 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 InstanceContext mana dengan melakukan asosiasi itu sendiri.

Sesi dan Streaming

Saat Anda memiliki data dalam jumlah besar 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 meskipun 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 layanan InstanceContextMode ke PerCall atau Konkurensi ke beberapa.

Catatan

MaxConcurrentSessions tidak berpengaruh dalam kasus ini karena hanya ada satu "sesi" yang tersedia.

Lihat juga