Fitur Penyederhanaan WCF

Topik ini membahas fitur baru yang membuat penulisan aplikasi WCF lebih sederhana.

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 Dihasilkan Yang Disederhanakan

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

Berikut ini adalah contoh file konfigurasi yang dihasilkan 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 ini adalah contoh file konfigurasi yang sama yang dihasilkan 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>

Contract-First Pengembangan

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

Menambahkan Referensi Layanan Dari Proyek Subset Portabel

Proyek subset portabel memungkinkan programmer rakitan .NET untuk mempertahankan satu pohon sumber dan sistem build sambil tetap mendukung beberapa implementasi .NET (desktop, Silverlight, Windows Phone, dan Xbox). Proyek subset portabel hanya mereferensikan pustaka portabel .NET yang merupakan rakitan 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.

Mode Kompatibilitas ASP.NET yang Default Diubah

WCF menyediakan 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 aspNetCompatibilityEnabled atribut ke true di bagian <serviceHostingEnvironment> dari web.config. Selain itu, layanan apa pun di appDomain ini harus memiliki RequirementsMode properti pada AspNetCompatibilityRequirementsAttribute set ke Allowed atau Required. Secara default AspNetCompatibilityRequirementsAttribute sekarang diatur ke Allowed dan templat aplikasi layanan WCF default mengatur aspNetCompatibilityEnabled atribut ke true. Untuk informasi selengkapnya, lihat Apa 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 menguntungkan skalabilitas ketika layanan mengirim pesan yang dialirkan ke beberapa klien yang membaca secara perlahan. WCF tidak lagi memblokir thread untuk setiap klien dan akan membebaskan thread tersebut untuk melayani klien lain.

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

Nilai Default Transportasi Baru

Tabel berikut ini menjelaskan pengaturan yang telah berubah dan tempat menemukan informasi tambahan.

Harta benda Aktif Default Baru Informasi Selengkapnya
batas waktu inisialisasi saluran NetTcpBinding 30 detik Properti ini menentukan berapa lama koneksi TCP dapat memakan waktu untuk mengautentikasi dirinya 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 dari ReceiveTimeout (10 menit) sehingga klien berbahaya yang tidak diautentikasi tidak membuat koneksi terikat ke server untuk waktu yang lama. Nilai defaultnya adalah 30 detik. Untuk informasi selengkapnya tentang ChannelInitializationTimeout
dengarkanLintasanTertunda NetTcpBinding 16 * jumlah prosesor Properti tingkat soket ini menjelaskan jumlah permintaan "penerimaan tertunda" yang akan diantrekan. Jika antrean backlog listen terisi, 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 dapat dinanti server pada pendengar. Ketika MaxPendingAccepts terlalu rendah, akan ada interval waktu kecil di mana semua saluran tunggu telah mulai melayani koneksi, tetapi tidak ada saluran baru yang mulai mendengarkan. Koneksi dapat tiba selama interval ini dan akan gagal karena tidak ada yang menunggunya di server. Properti ini dapat dikonfigurasi dengan mengatur 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 berapa banyak koneksi yang telah diterima transportasi tetapi belum diambil oleh ServiceModel Dispatcher. 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 yang mendasar. Ini ada untuk membatasi durasi waktu SMSvcHost.exe layanan digunakan untuk membaca data pendahuluan dari sambungan yang masuk. Untuk informasi selengkapnya, lihat Mengonfigurasi Layanan Berbagi Port Net.TCP.

Nota

Default baru ini hanya digunakan jika Anda menyebarkan layanan WCF pada komputer dengan .NET Framework 4.5. Jika Anda menyebarkan layanan yang sama pada komputer dengan .NET Framework 4.0, maka default .NET Framework 4.0 digunakan. Dalam kasus seperti itu, disarankan untuk mengonfigurasi pengaturan ini secara eksplisit.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas berisi nilai kuota yang dapat dikonfigurasi untuk pembaca kamus XML yang membatasi jumlah memori yang digunakan oleh encoder saat membuat pesan. Meskipun kuota ini dapat dikonfigurasi, nilai default telah berubah untuk mengurangi kemungkinan bahwa pengembang perlu mengaturnya secara eksplisit. MaxReceivedMessageSize kuota belum diubah sehingga masih dapat membatasi konsumsi memori, mencegah Anda harus berurusan dengan kompleksitas XmlDictionaryReaderQuotas. Tabel berikut menunjukkan kuota, nilai default barunya, dan penjelasan singkat tentang untuk apa setiap kuota digunakan.

Nama Kuota Nilai Bawaan Deskripsi
MaxArrayLength Int32.MaxValue Mendapatkan dan mengatur panjang array maksimum yang diizinkan. Kuota ini membatasi ukuran maksimum dari array tipe dasar yang dikembalikan oleh pembaca XML, termasuk array byte. Kuota ini tidak membatasi konsumsi memori di pembaca XML itu sendiri, tetapi dalam komponen apa pun yang menggunakan pembaca. Misalnya, ketika DataContractSerializer menggunakan pembaca yang diamankan dengan MaxArrayLength, pembaca tersebut tidak akan mendeserialisasi array byte yang ukurannya lebih besar dari kuota ini.
MaxBytesPerRead Int32.MaxValue Mengambil dan menetapkan jumlah byte maksimum yang boleh dikembalikan pada tiap pembacaan. Kuota ini membatasi jumlah byte yang dibaca dalam satu operasi Baca saat membaca tag mulai elemen dan atributnya. (Dalam kasus yang tidak dialirkan, nama elemen itu sendiri tidak dihitung terhadap kuota). Memiliki terlalu banyak atribut XML dapat menggunakan waktu pemrosesan yang tidak proporsional karena nama atribut harus diperiksa keunikannya. MaxBytesPerRead mengurangi ancaman ini.
MaxDepth 128 simpul dalam Kuota ini membatasi kedalaman sarang maksimum elemen XML. MaxDepth berinteraksi dengan MaxBytesPerRead: pembaca selalu menyimpan data dalam memori untuk elemen saat ini dan semua leluhurnya, sehingga konsumsi memori maksimum pembaca sebanding dengan produk dari dua pengaturan ini. Saat mendeserialisasi grafik objek yang sangat bersarang, deserializer dipaksa untuk mengakses seluruh tumpukan dan melemparkan yang tidak dapat dipulihkan StackOverflowException. Korelasi langsung ada antara xml bersarang dan objek bersarang untuk DataContractSerializer dan XmlSerializer. MaxDepth digunakan untuk mengurangi ancaman ini.
MaxNameTableCharCount Int32.MaxValue Kuota ini membatasi jumlah maksimum karakter yang diizinkan dalam nametable. Nametable berisi string tertentu (seperti namespace dan awalan) yang ditemui saat memproses dokumen XML. Karena string ini di-buffer dalam memori, kuota ini digunakan untuk mencegah buffering yang berlebihan ketika streaming diharapkan.
MaxStringContentLength Int32.MaxValue Kuota ini membatasi ukuran string maksimum yang dikembalikan pembaca XML. Kuota ini tidak membatasi konsumsi memori di pembaca XML itu sendiri, tetapi dalam komponen yang menggunakan pembaca. Misalnya, jika DataContractSerializer menggunakan pembaca yang diamankan dengan MaxStringContentLength, maka string yang lebih besar dari kuota ini tidak akan dideserialisasi.

Penting

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

Nota

Default baru ini hanya digunakan jika Anda menyebarkan layanan WCF pada komputer dengan .NET Framework 4.5. Jika Anda menyebarkan layanan yang sama pada komputer dengan .NET Framework 4.0, maka default .NET Framework 4.0 digunakan. Dalam kasus seperti itu, disarankan untuk mengonfigurasi pengaturan ini secara eksplisit.

Validasi Konfigurasi WCF

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

Tips Alat untuk Editor XML

Untuk membantu pengembang layanan WCF baru dan yang sudah ada untuk mengonfigurasi layanan mereka, editor XML Visual Studio sekarang menyediakan tipsalat untuk setiap elemen konfigurasi dan propertinya yang merupakan bagian dari file konfigurasi layanan.

Penyempurnaan BasicHttpBinding

  1. Mengaktifkan satu titik akhir WCF untuk merespons mode autentikasi yang berbeda.

  2. Memungkinkan pengaturan keamanan layanan WCF dikontrol oleh IIS