Fitur Penyederhanaan WCF

Topik ini membahas fitur baru yang menyederhanakan penulisan aplikasi WCF.

gRPC sebagai alternatif untuk WCF

gRPC adalah kerangka kerja RPC modern yang merupakan alternatif populer untuk WCF. gRPC dibangun di atas HTTP/2, yang memberikan sejumlah keunggulan daripada WCF, termasuk:

  • Performa: gRPC jauh lebih efisien daripada WCF, terutama untuk koneksi yang berjalan lama.
  • Skalabilitas: gRPC dirancang untuk menskalakan ke sejumlah besar klien dan server.
  • Keamanan: gRPC mendukung berbagai mekanisme keamanan, termasuk TLS dan autentikasi.
  • Lintas platform: gRPC netral terhadap platform dan dapat digunakan dengan berbagai bahasa pemrograman.

Untuk informasi selengkapnya tentang mengembangkan atau memigrasikan aplikasi WCF ke gRPC, lihat:

File Konfigurasi yang Disederhanakan

Saat Anda menambahkan referensi layanan di Visual Studio atau menggunakan alat SvcUtil.exe, file konfigurasi klien akan dibuat. Dalam WCF versi sebelumnya, file konfigurasi ini berisi nilai setiap properti pengikatan meskipun nilainya berupa nilai default. Di WCF 4.5, file konfigurasi yang dibuat hanya berisi properti pengikatan yang diatur ke nilai non-default.

Berikut contoh file konfigurasi yang dibuat oleh WCF 3.0.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false"
                    hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192"
                        maxArrayLength="16384" maxBytesPerRead="4096"
                        maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Berikut contoh file konfigurasi yang sama yang dibuat oleh WCF 4.5.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Pengembangan Kontrak-Pertama

WCF kini memiliki dukungan untuk pengembangan kontrak-pertama. Alat svcutil.exe memiliki tombol /serviceContract yang memungkinkan Anda menghasilkan layanan dan kontrak data dari dokumen WSDL.

Menambahkan Referensi Layanan Dari Proyek Subset Portabel

Proyek subset portabel memungkinkan pemrogram perakitan .NET untuk mempertahankan pohon sumber tunggal dan sistem build sambil tetap mendukung beberapa implementasi .NET (desktop, Silverlight, Windows Phone, dan Xbox). Proyek subset portabel hanya merujuk pustaka portabel .NET yang merupakan assembly yang dapat digunakan pada implementasi .NET apa pun. Pengalaman pengembang sama dengan menambahkan referensi layanan dalam aplikasi klien WCF lainnya. Untuk informasi selengkapnya, lihat Menambahkan Referensi Layanan di Proyek Subset Portabel.

Default Mode Kompatibilitas ASP.NET Diubah

WCF dilengkapi mode kompatibilitas ASP.NET untuk memberi pengembang akses penuh ke fitur dalam alur HTTP ASP.NET saat menulis layanan WCF. Untuk menggunakan mode ini, Anda harus mengatur atribut aspNetCompatibilityEnabled ke benar di bagian <serviceHostingEnvironment> web.config. Selain itu, layanan apa pun dalam appDomain ini harus memiliki properti RequirementsMode pada AspNetCompatibilityRequirementsAttribute-nya yang diatur ke Allowed atau Required. Secara default, AspNetCompatibilityRequirementsAttribute kini diatur ke Allowed dan templat aplikasi layanan WCF default mengatur atribut aspNetCompatibilityEnabled ke true. Untuk informasi selengkapnya, lihat Yang Baru di Windows Communication Foundation 4.5 dan Layanan WCF dan ASP.NET.

Peningkatan Streaming

  • Dukungan baru untuk streaming asinkron telah ditambahkan ke WCF. Untuk mengaktifkan streaming asinkron, tambahkan perilaku titik akhir DispatcherSynchronizationBehavior ke host layanan dan atur properti AsynchronousSendEnabled-nya ke true. Ini dapat memanfaatkan skalabilitas saat layanan mengirim pesan yang dialirkan ke beberapa klien yang membaca secara perlahan. WCF tidak memblokir satu rangkaian per klien lagi dan akan membebaskan rangkaian untuk melayani klien lain.

  • Menghapus batasan terkait buffer pesan saat layanan di-host IIS. Dalam WCF versi sebelumnya, saat menerima pesan untuk layanan yang di-host IIS yang menggunakan transfer pesan streaming, ASP.NET akan melakukan buffer seluruh pesan sebelum mengirimkannya ke WCF. Hal ini akan menyebabkan konsumsi memori yang besar. Buffering ini telah dihapus di .NET Framework 4.5 dan layanan WCF yang di-host IIS kini dapat mulai memproses aliran masuk sebelum seluruh pesan diterima, sehingga memungkinkan streaming yang sebenarnya. Hal ini memungkinkan WCF langsung merespons pesan dan memungkinkan peningkatan performa. Selain itu, Anda tidak harus menentukan nilai lagi untuk maxRequestLength, batas ukuran ASP.NET pada permintaan masuk. Jika properti ini diatur, properti diabaikan. Untuk informasi selengkapnya tentang maxRequestLength, elemen konfigurasi <>httpRuntime. Anda masih perlu mengonfigurasi maxAllowedContentLength. Untuk informasi selengkapnya, lihat Batas Permintaan IIS.

Nilai Default Transportasi Baru

Tabel berikut menjelaskan pengaturan yang telah diubah dan tempat untuk mendapatkan informasi tambahan.

Properti Aktif Default Baru Informasi Selengkapnya
channelInitializationTimeout NetTcpBinding 30 detik Properti ini menentukan durasi yang dibutuhkan koneksi TCP untuk mengautentikasi sendiri menggunakan protokol .NET Framing. Klien perlu mengirim beberapa data awal sebelum server memiliki informasi yang cukup untuk melakukan autentikasi. Batas waktu ini sengaja dibuat lebih kecil daripada ReceiveTimeout (10 menit) sehingga klien berbahaya yang tidak diautentikasi tidak mempertahankan koneksi ke server untuk waktu yang lama. Nilai {i>defaultChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * jumlah prosesor Properti tingkat soket ini menjelaskan jumlah permintaan "penerimaan tertunda" yang akan diantrekan. Jika antrean tumpukan mendengarkan terisi penuh, permintaan soket baru akan ditolak. Untuk informasi selengkapnya tentang ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * jumlah prosesor untuk transportasi

4 * jumlah prosesor untuk SMSvcHost.exe
Properti ini membatasi jumlah saluran yang bisa dimiliki server saat menunggu listener. Jika MaxPendingAccepts terlalu rendah, akan ada interval waktu yang kecil saat semua saluran tunggu telah mulai melayani koneksi, tetapi tidak ada saluran baru yang mulai mendengarkan. Koneksi bisa tiba selama interval ini dan akan gagal karena tidak ada yang menunggunya di server. Properti ini dapat dikonfigurasi dengan mengatur properti MaxPendingConnections ke angka yang lebih besar. Untuk informasi selengkapnya, lihat MaxPendingAccepts dan Mengonfigurasi Layanan Berbagi Port Net.TCP
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * jumlah prosesor Properti ini mengontrol banyaknya koneksi yang telah diterima transportasi namun belum diambil oleh Pengirim ServiceModel. Untuk mengatur nilai ini, gunakan MaxConnections pada pengikatan atau maxOutboundConnectionsPerEndpoint pada elemen pengikatan. Untuk informasi selengkapnya tentang MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 detik Properti ini menentukan batas waktu untuk membaca data pembingkaian TCP dan melakukan pengiriman koneksi dari koneksi mendasar. Ini ada untuk membatasi jumlah waktu layanan SMSvcHost.exe tetap terlibat untuk membaca data pembuka dari koneksi masuk. Untuk informasi selengkapnya, lihat Mengonfigurasi Layanan Berbagi Port Net.TCP.

Catatan

Default baru ini hanya digunakan jika Anda menyebarkan layanan WCF di komputer dengan .NET Framework 4.5. Jika Anda menyebarkan layanan yang sama pada komputer dengan .NET Framework 4.0, setelan default .NET Framework 4.0 akan digunakan. Dalam kasus ini, sebaiknya konfigurasikan setelan ini secara eksplisit.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas berisi nilai kuota yang dapat dikonfigurasi untuk pembaca kamus XML yang membatasi jumlah memori yang digunakan oleh pengenkode saat membuat pesan. Meskipun kuota ini dapat dikonfigurasi, nilai default telah berubah untuk mengurangi kemungkinan bahwa pengembang perlu mengaturnya secara eksplisit. Kuota MaxReceivedMessageSize belum diubah sehingga masih dapat membatasi penggunaan memori yang mencegah perlunya menangani kompleksitas XmlDictionaryReaderQuotas. Tabel berikut memperlihatkan kuota, nilai default barunya, dan penjelasan singkat tentang fungsi setiap kuota.

Nama Kuota Nilai Default Deskripsi
MaxArrayLength Int32.MaxValue Mendapatkan dan mengatur panjang rangkaian maksimum yang diizinkan. Kuota ini membatasi ukuran maksimum rangkaian primitif yang ditampilkan pembaca XML, termasuk rangkaian byte. Kuota ini tidak membatasi penggunaan memori di pembaca XML itu sendiri, tetapi dalam komponen apa pun yang menggunakan pembaca. Misalnya, saat DataContractSerializer menggunakan pembaca yang diamankan dengan MaxArrayLength, rangkaian byte yang lebih besar dari kuota ini tidak akan dideserialisasi.
MaxBytesPerRead Int32.MaxValue Mendapatkan dan mengatur byte maksimum yang diizinkan yang ditampilkan untuk setiap pembacaan. Kuota ini membatasi jumlah byte yang dibaca dalam satu operasi Baca saat membaca tag permulaan elemen dan atributnya. (Dalam kasus yang tidak dialirkan, nama elemen itu sendiri tidak mengurangi kuota). Terlalu banyak atribut XML dapat mengurangi waktu pemrosesan yang tidak proporsional karena keunikan nama atribut harus diperiksa. MaxBytesPerRead menanggulangi ancaman ini.
MaxDepth 128 simpul dalam Kuota ini membatasi kedalaman pelapisan maksimum elemen XML. MaxDepth berinteraksi dengan MaxBytesPerRead: pembaca selalu menyimpan data dalam memori untuk elemen saat ini dan semua pendahulunya, sehingga konsumsi memori maksimum pembaca sebanding dengan produk dari kedua setelan ini. Saat mendeserialisasi grafik objek berlapis dalam, alat deserialisasi dipaksa untuk mengakses seluruh tumpukan dan menghilangkan yang tidak dapat dipulihkan StackOverflowException. Korelasi langsung ada di antara pelapisan XML dan pelapisan objek untuk DataContractSerializer dan XmlSerializer. MaxDepth digunakan untuk menanggulangi ancaman ini.
MaxNameTableCharCount Int32.MaxValue Kuota ini membatasi jumlah maksimum karakter yang diizinkan dalam papan nama. Papan nama berisi string tertentu (seperti namespace layanan dan awalan) yang dijumpai saat memproses dokumen XML. Karena string ini di-buffer dalam memori, kuota ini digunakan untuk mencegah buffering berlebihan saat streaming diharapkan.
MaxStringContentLength Int32.MaxValue Kuota ini membatasi ukuran string maksimum yang ditampilkan pembaca XML. Kuota ini tidak membatasi konsumsi memori di pembaca XML itu sendiri, tetapi dalam komponen yang menggunakan pembaca. Misalnya, saat DataContractSerializer menggunakan pembaca yang diamankan dengan MaxStringContentLength, string yang lebih besar dari kuota ini tidak akan dideserialisasi.

Penting

Lihat "Menggunakan XML Dengan Aman" di bagian Pertimbangan Keamanan untuk Data untuk mengetahui informasi selengkapnya tentang mengamankan data.

Catatan

Default baru ini hanya digunakan jika Anda menyebarkan layanan WCF di komputer dengan .NET Framework 4.5. Jika Anda menyebarkan layanan yang sama pada komputer dengan .NET Framework 4.0, setelan default .NET Framework 4.0 akan digunakan. Dalam kasus ini, sebaiknya konfigurasikan setelan ini secara eksplisit.

Validasi Konfigurasi WCF

Sebagai bagian dari proses build dalam Visual Studio, file konfigurasi WCF kini divalidasi. Daftar kesalahan validasi atau peringatan ditampilkan dalam Visual Studio jika validasi gagal.

Tip-alat Editor XML

Untuk memudahkan pengembang layanan WCF yang telah ada dan yang baru mengonfigurasi layanan mereka, editor XML Visual Studio kini menyediakan tip-alat untuk setiap elemen konfigurasi dan propertinya yang merupakan bagian dari file konfigurasi layanan.

Penyempurnaan BasicHttpBinding

  1. Memungkinkan satu titik akhir WCF merespons mode autentikasi yang berbeda.

  2. Memungkinkan setelan keamanan layanan WCF dikontrol oleh IIS