Layanan WCF dan ASP.NET

Topik ini membahas layanan Windows Communication Foundation (WCF) hosting yang berdampingan dengan ASP.NET dan menghostingnya dalam mode kompatibilitas ASP.NET.

WCF Hosting yang berdampingan dengan ASP.NET

Layanan WCF yang dihosting di Layanan Informasi Internet (IIS) dapat ditemukan dengan halaman .ASPX dan layanan Web ASMX di dalam satu Domain Aplikasi umum. ASP.NET menyediakan layanan infrastruktur umum seperti manajemen AppDomain dan kompilasi dinamis untuk WCF dan runtime HTTP ASP.NET. Konfigurasi default untuk WCF berdampingan dengan ASP.NET.

Screenshot showing WCF Services and ASP .NET: sharing state.

runtime HTTP ASP.NET menangani permintaan ASP.NET tetapi tidak berpartisipasi dalam pemrosesan permintaan yang ditujukan untuk layanan WCF, meskipun layanan ini di-host di AppDomain yang sama seperti konten ASP.NET. Sebaliknya, Model Layanan WCF mencegat pesan yang ditujukan ke layanan WCF dan merutekannya melalui tumpukan transportasi/saluran WCF.

Hasil dari model yang bedampingan adalah sebagai berikut:

  • Layanan ASP.NET dan WCF dapat berbagi status AppDomain. Karena kedua kerangka kerja dapat hidup berdampingan di AppDomain yang sama, WCF juga dapat berbagi status AppDomain dengan ASP.NET (termasuk variabel statis, peristiwa, dan sebagainya).

  • Layanan WCF berperilaku secara konsisten, terlepas dari lingkungan hosting dan transportasi. Runtime HTTP ASP.NET sengaja digabungkan ke lingkungan hosting IIS/ASP.NET dan komunikasi HTTP. Sebaliknya, WCF dirancang untuk berperilaku secara konsisten di seluruh lingkungan hosting (WCF berperilaku secara konsisten baik di dalam maupun di luar IIS) dan di seluruh transportasi (layanan yang dihosting di IIS 7.0 dan versi yang lebih baru memiliki perilaku yang konsisten di semua titik akhir yang dieksposnya, bahkan jika beberapa dari titik akhir tersebut menggunakan protokol selain HTTP).

  • Dalam AppDomain, fitur yang diterapkan oleh runtime HTTP berlaku untuk konten ASP.NET tetapi tidak untuk WCF. Banyak fitur khusus HTTP dari platform aplikasi ASP.NET tidak berlaku untuk Layanan WCF yang dihosting di dalam AppDomain yang berisi konten ASP.NET. Contoh fitur tersebut antara lain sebagai berikut:

    • HttpContext: Current selalu null saat diakses dari dalam layanan WCF. Gunakan RequestContext sebagai gantinya.

    • Otorisasi berbasis file: Model keamanan WCF tidak mengizinkan daftar kontrol akses (ACL) yang diterapkan ke file .svc layanan saat memutuskan apakah permintaan layanan diotorisasi.

    • Otorisasi URL berbasis konfigurasi: Demikian pula, model keamanan WCF tidak mematuhi aturan otorisasi berbasis URL yang ditentukan dalam elemen konfigurasi <otorisasi> System.Web. Pengaturan ini diabaikan untuk permintaan WCF jika layanan berada di ruang URL yang diamankan oleh aturan otorisasi URL ASP.NET.

    • Ekstensibilitas HttpModule: Infrastruktur hosting WCF memotong permintaan WCF saat peristiwa PostAuthenticateRequest dimunculkan dan tidak mengembalikan pemrosesan ke alur HTTP ASP.NET. Modul yang dikodekan untuk mencegat permintaan pada tahap selanjutnya dari alur tidak mencegat permintaan WCF.

    • Peniruan ASP.NET: Secara default, permintaan WCF selalu berjalan sebagai identitas proses IIS, bahkan jika ASP.NET diatur untuk mengaktifkan peniruan identitas menggunakan opsi konfigurasi <identity impersonate="true" /> System.Web.

Pembatasan ini hanya berlaku untuk layanan WCF yang dihosting di aplikasi IIS. Perilaku konten ASP.NET tidak terpengaruh oleh keberadaan WCF.

Aplikasi WCF yang memerlukan fungsionalitas yang secara tradisional disediakan oleh alur HTTP harus mempertimbangkan untuk menggunakan setara WCF, yang independen host dan transportasi:

Atau, Anda dapat mempertimbangkan untuk menjalankan layanan Anda dalam mode kompatibilitas ASP.NET WCF.

Layanan WCF hosting dalam mode kompatibilitas ASP.NET

Meskipun model WCF dirancang untuk berperilaku secara konsisten di seluruh lingkungan hosting dan transportasi, sering kali ada skenario ketika aplikasi tidak memerlukan tingkat fleksibilitas ini. Mode kompatibilitas ASP.NET WCF cocok untuk skenario yang tidak memerlukan kemampuan untuk menghosting di luar IIS atau untuk berkomunikasi melalui protokol selain HTTP, tetapi mode ini menggunakan semua fitur platform aplikasi Web ASP.NET.

Tidak seperti konfigurasi default yang berdampingan, ketika infrastruktur hosting WCF memotong pesan WCF dan mengarahkannya keluar dari alur HTTP, layanan WCF yang berjalan dalam Mode Kompatibilitas ASP.NET berpartisipasi penuh dalam siklus hidup permintaan HTTP ASP.NET. Dalam mode kompatibilitas, layanan WCF menggunakan alur HTTP melalui implementasi IHttpHandler, mirip dengan cara menangani permintaan halaman ASPX dan layanan Web ASMX. Akibatnya, WCF berperilaku identik dengan ASMX sehubungan dengan fitur ASP.NET berikut:

  • HttpContext: Layanan WCF yang berjalan dalam Mode Kompatibilitas ASP.NET dapat mengakses Current dan status terkaitnya.

  • Otorisasi berbasis file: Layanan WCF yang berjalan dalam mode kompatibilitas ASP.NET dapat diamankan dengan melampirkan daftar kontrol akses sistem file (ACL) ke file .svc layanan.

  • Otorisasi URL yang dapat dikonfigurasi: Aturan otorisasi URL ASP.NET diterapkan untuk permintaan WCF saat layanan WCF berjalan dalam Mode Kompatibilitas ASP.NET.

  • HttpModuleCollection diperpanjang: Karena layanan WCF yang berjalan dalam Mode Kompatibilitas ASP.NET berpartisipasi penuh dalam siklus hidup permintaan HTTP ASP.NET, modul HTTP apa pun yang dikonfigurasi dalam alur HTTP dapat beroperasi pada permintaan WCF sebelum dan sesudah permintaan layanan.

  • Peniruan ASP.NET: Layanan WCF dijalankan menggunakan identitas saat ini dari utas yang ditiru ASP.NET, yang mungkin berbeda dari identitas proses IIS jika peniruan ASP.NET telah diaktifkan untuk aplikasi. Jika peniruan ASP.NET dan peniruan WCF keduanya diaktifkan untuk operasi layanan tertentu, implementasi layanan akhirnya berjalan menggunakan identitas yang diperoleh dari WCF.

Mode kompatibilitas ASP.NET WCF diaktifkan pada tingkat aplikasi melalui konfigurasi berikut (terletak di file Web.config aplikasi):

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Nilai ini default menjadi false jika tidak ditentukan. Nilai false menunjukkan bahwa semua layanan WCF yang berjalan di aplikasi tidak akan berjalan dalam Mode Kompatibilitas ASP.NET.

Karena Mode Kompatibilitas ASP.NET menyiratkan semantik pemrosesan permintaan yang pada dasarnya berbeda dari default WCF, implementasi layanan individu memiliki kemampuan untuk mengontrol apakah mereka berjalan di dalam aplikasi yang Mode Kompatibilitas ASP.NET telah diaktifkan. Layanan dapat menggunakan AspNetCompatibilityRequirementsAttribute untuk menunjukkan apakah mereka mendukung Mode Kompatibilitas ASP.NET. Nilai default untuk atribut ini adalah Allowed.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

Tabel berikut mengilustrasikan cara pengaturan mode kompatibilitas seluruh aplikasi berinteraksi dengan tingkat dukungan yang dinyatakan masing-masing layanan:

Pengaturan Mode Kompatibilitas di seluruh aplikasi [AspNetCompatibilityRequirementsMode]

Pengaturan
Hasil yang Diamati
aspNetCompatibilityEnabled = "true" Required Layanan berhasil diaktifkan.
aspNetCompatibilityEnabled = "true" Allowed Layanan berhasil diaktifkan.
aspNetCompatibilityEnabled = "true" NotAllowed Kesalahan aktivasi terjadi saat layanan menerima pesan.
aspNetCompatibilityEnabled = "false" Required Kesalahan aktivasi terjadi saat layanan menerima pesan.
aspNetCompatibilityEnabled = "false" Allowed Layanan berhasil diaktifkan.
aspNetCompatibilityEnabled = "false" NotAllowed Layanan berhasil diaktifkan.

Catatan

IIS 7.0 dan WS memungkinkan layanan WCF untuk berkomunikasi melalui protokol selain HTTP. Namun, layanan WCF yang berjalan di aplikasi yang telah mengaktifkan mode kompatibilitas ASP.NET tidak diizinkan untuk mengekspos titik akhir non-HTTP. Konfigurasi seperti itu menghasilkan pengecualian aktivasi ketika layanan menerima pesan pertamanya.

Untuk informasi selengkapnya tentang mengaktifkan mode kompatibilitas ASP.NET untuk layanan WCF, baca AspNetCompatibilityRequirementsMode dan contoh Kompatibilitas ASP.NET.

Lihat juga