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 HttpCookieSession menunjukkan cara membangun saluran protokol kustom untuk menggunakan cookie HTTP untuk manajemen sesi. Saluran ini memungkinkan komunikasi antara layanan Windows Communication Foundation (WCF) dan klien ASMX atau antara klien WCF dan layanan ASMX.
Saat klien memanggil metode Web dalam layanan Web ASMX yang berbasis sesi, mesin ASP.NET melakukan hal berikut:
Menghasilkan ID unik (ID sesi).
Menghasilkan objek sesi dan mengaitkannya dengan ID unik.
Menambahkan ID unik ke header respons HTTP Set-Cookie dan mengirimkannya ke klien.
Mengidentifikasi klien pada panggilan berikutnya berdasarkan ID sesi yang dikirimnya.
Klien menyertakan ID sesi ini dalam permintaan berikutnya ke server. Server menggunakan ID sesi dari klien untuk memuat objek sesi yang sesuai untuk konteks HTTP saat ini.
Pola Pertukaran Pesan Saluran HttpCookieSession
Sampel ini memungkinkan sesi untuk skenario yang mirip dengan ASMX. Di bagian bawah tumpukan saluran kami, ada protokol transport HTTP yang mendukung IRequestChannel dan IReplyChannel. Ini adalah tugas saluran untuk menyediakan sesi ke lapisan yang lebih tinggi dalam tumpukan saluran. Sampel mengimplementasikan dua saluran, (IRequestSessionChannel dan IReplySessionChannel) yang mendukung sesi.
Saluran Layanan
Contoh menyediakan saluran layanan dalam kelas HttpCookieReplySessionChannelListener. Kelas ini mengimplementasikan IChannelListener antarmuka dan mengonversi IReplyChannel saluran dari yang lebih rendah di tumpukan saluran menjadi IReplySessionChannel. Proses ini dapat dibagi menjadi bagian-bagian berikut:
Saat pendengar saluran dibuka, ia menerima saluran internal dari pendengar internalnya. Karena pendengar dalam adalah pendengar datagram dan masa pakai saluran yang diterima dipisahkan dari masa pakai pendengar, kita dapat menutup pendengar dalam dan hanya berpegang pada saluran dalam
this.innerChannelListener.Open(timeoutHelper.RemainingTime()); this.innerChannel = this.innerChannelListener.AcceptChannel(timeoutHelper.RemainingTime()); this.innerChannel.Open(timeoutHelper.RemainingTime()); this.innerChannelListener.Close(timeoutHelper.RemainingTime());Ketika proses terbuka selesai, kami menyiapkan perulangan pesan untuk menerima pesan dari saluran dalam.
IAsyncResult result = BeginInnerReceiveRequest(); if (result != null && result.CompletedSynchronously) { // do not block the user thread this.completeReceiveCallback ??= new WaitCallback(CompleteReceiveCallback); ThreadPool.QueueUserWorkItem(this.completeReceiveCallback, result); }Ketika pesan tiba, saluran layanan memeriksa pengidentifikasi sesi dan mendemultipleks ke saluran sesi yang sesuai. Pendengar saluran mempertahankan pemetaan yang menghubungkan pengidentifikasi sesi ke instans saluran sesi.
Dictionary<string, IReplySessionChannel> channelMapping;
Kelas HttpCookieReplySessionChannel mengimplementasikan IReplySessionChannel. Tingkat yang lebih tinggi dari tumpukan saluran memanggil metode ReceiveRequest untuk membaca permintaan untuk sesi ini. Setiap saluran sesi memiliki antrean pesan privat yang diisi oleh saluran layanan.
InputQueue<RequestContext> requestQueue;
Dalam kasus ketika seseorang memanggil ReceiveRequest metode dan tidak ada pesan dalam antrean pesan, saluran menunggu waktu tertentu sebelum mematikan dirinya sendiri. Ini membersihkan saluran sesi yang dibuat untuk klien non-WCF.
Kami menggunakan channelMapping untuk melacak ReplySessionChannels, dan kami tidak menutup innerChannel dasar kami sampai semua saluran yang diterima telah ditutup. Cara HttpCookieReplySessionChannel ini dapat tetap ada setelah masa pakai HttpCookieReplySessionChannelListener. Kami juga tidak perlu khawatir tentang pendengar yang mengumpulkan sampah di bawah kami karena saluran yang diterima menyimpan referensi ke pendengar mereka melalui OnClosed panggilan balik.
Saluran klien
Saluran klien yang sesuai ada di HttpCookieSessionChannelFactory kelas . Selama pembuatan saluran, pabrik saluran membungkus saluran permintaan internal dengan HttpCookieRequestSessionChannel. Kelas HttpCookieRequestSessionChannel meneruskan panggilan ke saluran permintaan yang mendasar. Saat klien menutup proksi, HttpCookieRequestSessionChannel mengirim pesan ke layanan yang menunjukkan bahwa saluran sedang ditutup. Dengan demikian, tumpukan saluran layanan dapat menonaktifkan saluran sesi yang sedang digunakan dengan lancar.
Pengikatan dan Elemen Pengikatan
Setelah membuat saluran layanan dan klien, langkah selanjutnya adalah mengintegrasikannya ke dalam runtime WCF. Saluran diekspos ke WCF melalui pengikatan dan elemen pengikatan. Pengikatan terdiri dari satu atau banyak elemen pengikatan. WCF menawarkan beberapa pengikatan yang ditentukan sistem; misalnya, BasicHttpBinding atau WSHttpBinding. Kelas HttpCookieSessionBindingElement berisi implementasi untuk elemen pengikatan. Ia mengesampingkan metode pembuatan pendengar saluran dan pabrik saluran untuk melakukan instansiasi pendengar saluran atau pabrik saluran yang diperlukan.
Sampel menggunakan pernyataan kebijakan untuk deskripsi layanan. Ini memungkinkan sampel untuk menerbitkan persyaratan salurannya ke klien lain yang dapat menggunakan layanan. Misalnya, elemen pengikatan ini menerbitkan pernyataan kebijakan untuk memberi tahu klien potensial bahwa ia mendukung sesi. Karena sampel memungkinkan properti ExchangeTerminateMessage dalam konfigurasi elemen pengikatan, ditambahkan pernyataan yang diperlukan untuk menunjukkan bahwa layanan mendukung tindakan pertukaran pesan tambahan untuk mengakhiri percakapan sesi. Klien kemudian dapat menggunakan tindakan ini. Kode WSDL berikut menunjukkan pernyataan kebijakan yang dibuat dari HttpCookieSessionBindingElement.
<wsp:Policy wsu:Id="HttpCookieSessionBinding_IWcfCookieSessionService_policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<wspe:Utf816FFFECharacterEncoding xmlns:wspe="http://schemas.xmlsoap.org/ws/2004/09/policy/encoding"/>
<mhsc:httpSessionCookie xmlns:mhsc="http://samples.microsoft.com/wcf/mhsc/policy"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Kelas HttpCookieSessionBinding adalah pengikatan yang disediakan sistem yang menggunakan elemen pengikatan yang dijelaskan sebelumnya.
Menambahkan Saluran ke Sistem Konfigurasi
Sampel menyediakan dua kelas yang mengekspos saluran sampel melalui konfigurasi. Yang pertama adalah BindingElementExtensionElement untuk HttpCookieSessionBindingElement. Sebagian besar implementasi didelegasikan ke HttpCookieSessionBindingConfigurationElement, yang berasal dari StandardBindingElement.
HttpCookieSessionBindingConfigurationElement memiliki properti yang sesuai dengan properti pada HttpCookieSessionBindingElement.
Bagian Perluasan Elemen Penghubung
Bagian HttpCookieSessionBindingElementSection ini adalah BindingElementExtensionElement yang mengekspos HttpCookieSessionBindingElement ke sistem konfigurasi. Dengan beberapa penggantian nama bagian konfigurasi, jenis elemen pengikatan dan cara membuat elemen pengikatan ditentukan. Kita kemudian dapat mendaftarkan bagian ekstensi dalam file konfigurasi sebagai berikut:
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="httpCookieSession"
type=
"Microsoft.ServiceModel.Samples.HttpCookieSessionBindingElementElement,
HttpCookieSessionExtension, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions >
</extensions>
<bindings>
<customBinding>
<binding name="allowCookiesBinding">
<textMessageEncoding messageVersion="Soap11WSAddressing10" />
<httpCookieSession sessionTimeout="10" exchangeTerminateMessage="true" />
<httpTransport allowCookies="true" />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Kode Uji
Kode pengujian untuk menggunakan transportasi sampel ini tersedia di direktori Klien dan Layanan. Ini terdiri dari dua pengujian —satu pengujian menggunakan pengikatan dengan allowCookies diatur ke true pada klien. Pengujian kedua memungkinkan penutupan secara eksplisit (menggunakan pertukaran pesan penghentian) pada binding.
Saat menjalankan sampel, Anda akan melihat output berikut:
Simple binding:
AddItem(10000,2): ItemCount=2
AddItem(10550,5): ItemCount=7
RemoveItem(10550,2): ItemCount=5
Items
10000, 2
10550, 3
Smart binding:
AddItem(10000,2): ItemCount=2
AddItem(10550,5): ItemCount=7
RemoveItem(10550,2): ItemCount=5
Items
10000, 2
10550, 3
Press <ENTER> to terminate client.
Untuk menyiapkan, mengompilasi, dan menjalankan sampel
Instal ASP.NET 4.0 menggunakan perintah berikut.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enablePastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Untuk membangun solusi, 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.