Aracılığıyla paylaş


WCF Basitleştirme Özellikleri

Bu konu başlığında, WCF uygulamaları yazmayı daha basit hale getiren yeni özellikler açıklanmaktadır.

WCF'ye alternatif olarak gRPC

gRPC, WCF'ye popüler bir alternatif olan modern bir RPC çerçevesidir. gRPC, AŞAĞıDAKIler dahil olmak üzere WCF'ye göre bir dizi avantaj sağlayan HTTP/2 üzerine kurulmuştur:

  • Performans: gRPC, özellikle uzun süre çalışan bağlantılar için WCF'den çok daha verimlidir.
  • Ölçeklenebilirlik: gRPC, çok sayıda istemci ve sunucuya ölçeklendirilecek şekilde tasarlanmıştır.
  • Güvenlik: gRPC, TLS ve kimlik doğrulaması dahil olmak üzere çeşitli güvenlik mekanizmalarını destekler.
  • Platformlar arası: gRPC platformdan bağımsızdır ve çeşitli programlama dilleri ile kullanılabilir.

WCF uygulamalarını geliştirme veya gRPC'ye geçirme hakkında daha fazla bilgi için bkz:

Basitleştirilmiş Oluşturulan Yapılandırma Dosyaları

Visual Studio'da bir hizmet başvurusu eklediğinizde veya SvcUtil.exe aracını kullandığınızda bir istemci yapılandırma dosyası oluşturulur. WCF'nin önceki sürümlerinde bu yapılandırma dosyaları, değeri varsayılan değer olsa bile her bağlama özelliğinin değerini içeriyordu. WCF 4.5'te oluşturulan yapılandırma dosyaları yalnızca varsayılan olmayan bir değere ayarlanmış bağlama özelliklerini içerir.

Aşağıda WCF 3.0 tarafından oluşturulan bir yapılandırma dosyası örneği verilmiştir.

<?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>

Aşağıda WCF 4.5 tarafından oluşturulan aynı yapılandırma dosyasının bir örneği verilmiştir.

<?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 Geliştirme

WCF artık sözleşme öncelikli geliştirme desteğine sahiptir. svcutil.exe aracının bir WSDL belgesinden hizmet ve veri sözleşmeleri oluşturmanıza olanak tanıyan bir /serviceContract anahtarı vardır.

Taşınabilir Alt Küme Projesinden Hizmet Referansı Ekleme

Taşınabilir alt küme projeleri, .NET derleme programcılarının tek bir kaynak ağacı ve derleme sistemini korumasını sağlarken aynı anda birden çok .NET uygulamasını (masaüstü, Silverlight, Windows Phone ve Xbox) desteklemeye devam eder. Taşınabilir alt küme projeleri yalnızca herhangi bir .NET uygulamasında kullanılabilecek derlemeler olan .NET taşınabilir kitaplıklarına başvurur. Geliştirici deneyimi, başka bir WCF istemci uygulamasına hizmet başvurusu eklemekle aynıdır. Daha fazla bilgi için bkz. Taşınabilir Alt Küme Projesinde Hizmet Başvurusu Ekleme.

ASP.NET Uyumluluk Modu Varsayılan Olarak Değiştirildi

WCF, wcf hizmetleri yazarken geliştiricilere ASP.NET HTTP işlem hattındaki özelliklere tam erişim vermek için ASP.NET uyumluluk modu sağlar. Bu modu kullanmak için özniteliğini aspNetCompatibilityEnabled web.configserviceHostingEnvironment< bölümünde true> olarak ayarlamanız gerekir. Ayrıca, bu appDomain içindeki herhangi bir hizmetin veya RequirementsModeolarak ayarlanmış özelliğine AspNetCompatibilityRequirementsAttributeAllowed sahip Required olması gerekir. Varsayılan olarak AspNetCompatibilityRequirementsAttribute şimdi Allowed olarak ayarlanır ve varsayılan WCF hizmet uygulaması şablonu aspNetCompatibilityEnabled özniteliğini true olarak ayarlar. Daha fazla bilgi için bkz. Windows Communication Foundation 4.5 ve WCF Hizmetleri ve ASP.NET'deki Yenilikler.

Akış Geliştirmeleri

  • WCF'ye zaman uyumsuz akış için yeni destek eklendi. Zaman uyumsuz akışı etkinleştirmek için hizmet konağına DispatcherSynchronizationBehavior uç nokta davranışını ekleyin ve AsynchronousSendEnabled özelliğini true olarak ayarlayın. Bu, bir hizmet akışlı iletileri yavaş okuyan birden çok istemciye gönderirken ölçeklenebilirlik sağlayabilir. WCF artık istemci başına bir iş parçacığını engellemez ve iş parçacığını başka bir istemciye hizmet vermesi için serbest bırakır.

  • Bir hizmet IIS barındırıldığında iletilerin arabelleğe alınmasıyla ilgili sınırlamalar kaldırıldı. WCF'nin önceki sürümlerinde, akış iletisi aktarımını kullanan IIS tarafından barındırılan bir hizmet için bir ileti alınırken, ASP.NET tüm iletiyi WCF'ye göndermeden önce arabelleğe alıyordu. Bu, büyük bellek tüketimine neden olabilir. Bu tampon mekanizması .NET Framework 4.5'te kaldırılmıştır ve artık IIS tarafından barındırılan WCF hizmetleri, iletinin tamamı alınmadan önce gelen akışı işlemeye başlayabilir, bu sayede gerçek zamanlı akış etkinleştirilir. Bu, WCF'nin iletilere hemen yanıt vermesini sağlar ve gelişmiş performans sağlar. Ayrıca, artık gelen isteklerde ASP.NET boyut sınırı için maxRequestLengthbir değer belirtmeniz gerekmez. Bu özellik ayarlandığında göz ardı edilir. Hakkında maxRequestLength daha fazla bilgi için bkz <. httpRuntime> yapılandırma öğesi. maxAllowedContentLength değerini yapılandırmanız gerekir. Daha fazla bilgi için bkz. IIS İstek Sınırları.

Yeni Taşıma Varsayılan Değerleri

Aşağıdaki tabloda değiştirilen ayarlar ve ek bilgilerin nerede bulunacağı açıklanmaktadır.

Mülkiyet Hakkında Yeni Varsayılan Daha Fazla Bilgi
kanalBaşlatmaZamanAşımı NetTcpBinding 30 saniye Bu özellik, bir TCP bağlantısının .NET Çerçeve protokolünü kullanarak kimliğini doğrulamasının ne kadar sürebileceğini belirler. Sunucunun kimlik doğrulaması gerçekleştirmek için yeterli bilgiye sahip olması için istemcinin bazı ilk verileri göndermesi gerekir. Bu zaman aşımı, kötü amaçlı kimliği doğrulanmamış istemcilerin sunucuya bağlı bağlantıları uzun süre tutmaması için kasıtlı olarak ReceiveTimeout'tan (10 dk) küçük hale getirilir. Varsayılan değer 30 saniyedir. Hakkında daha fazla bilgi için ChannelInitializationTimeout
yorumlama listesi NetTcpBinding 16 * işlemci sayısı Bu yuva düzeyi özelliği, kuyruğa alınması gereken "beklemedeki kabul" isteklerinin sayısını açıklar. Dinleme kuyruğu dolarsa, yeni soket istekleri reddedilir. Hakkında daha fazla bilgi için ListenBacklog
maxPendingAccepts (Beklenen Kabul Sayısı Maksimumu) ConnectionOrientedTransportBindingElement (Bağlantı Yönelimli Taşıma Bağlama Öğesi)

SMSvcHost.exe
Taşıma için 2 * işlemci sayısı

SMSvcHost.exe için 4 * işlemci sayısı
Bu özellik, sunucunun dinleyicide bekleyebileceği kanal sayısını sınırlar. MaxPendingAccepts çok düşük olduğunda, tüm bekleme kanallarının bağlantılara hizmet verme işlemine başladığı ancak yeni kanalların dinlemeye başlamadığı küçük bir zaman aralığı olacaktır. Bağlantı bu aralıkta gelebilir ve sunucuda bekleyen hiçbir şey olmadığından başarısız olur. Bu özellik, MaxPendingConnections özelliği daha büyük bir sayıya ayarlanarak yapılandırılabilir. Daha fazla bilgi için bkz MaxPendingAccepts. ve Net.TCP Bağlantı Noktası Paylaşım Hizmetini Yapılandırma
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * işlemci sayısı Bu özellik, bir aktarımın kabul ettiği ancak ServiceModel Dağıtıcısı tarafından henüz alınmamış olan bağlantıların sayısını denetler. Bu değeri ayarlamak için MaxConnections bağlamada veya maxOutboundConnectionsPerEndpoint bağlama öğesinde kullanın. Hakkında daha fazla bilgi için MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 saniye Bu özellik, TCP çerçeve verilerini okumak ve temel alınan bağlantılardan bağlantı dağıtımı gerçekleştirmek için zaman aşımını belirtir. Bu, SMSvcHost.exe hizmetinin gelen bir bağlantıdan ön veriyi okuma süresine bir sınır koymak amacını taşır. Daha fazla bilgi için bkz. Net.TCP Bağlantı Noktası Paylaşım Hizmetini Yapılandırma.

Uyarı

Bu yeni varsayılanlar yalnızca WCF hizmetini .NET Framework 4.5 yüklü bir makineye dağıttığınızda kullanılır. .NET Framework 4.0 ile bir makinede aynı hizmeti dağıtırsanız, .NET Framework 4.0 varsayılanları kullanılır. Böyle durumlarda bu ayarların açıkça yapılandırılması önerilir.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas , bir kodlayıcı tarafından ileti oluşturulurken kullanılan bellek miktarını sınırlayan XML sözlük okuyucuları için yapılandırılabilir kota değerleri içerir. Bu kotalar yapılandırılabilir olsa da, bir geliştiricinin bunları açıkça ayarlaması gerekme olasılığını azaltacak şekilde varsayılan değerler değişmiştir. MaxReceivedMessageSize kotası değiştirilmedi, böylece bellek tüketimini sınırlamaya devam ederek, sizin XmlDictionaryReaderQuotas karmaşıklığıyla ilgilenmek zorunda kalmanızı önleyebilir. Aşağıdaki tabloda kotalar, yeni varsayılan değerleri ve her kotanın ne için kullanıldığına ilişkin kısa bir açıklama gösterilmektedir.

Kota Adı Varsayılan Değer Açıklama
MaxArrayLength Int32.MaxValue İzin verilen en fazla dizi uzunluğunu alır ve ayarlar. Bu kota, bayt dizileri de dahil olmak üzere XML okuyucusunun döndürdüğü temel öğe dizisinin en büyük boyutunu sınırlar. Bu kota, XML okuyucunun kendisinde değil, okuyucuyu kullanan bileşende bellek tüketimini sınırlamaz. Örneğin, DataContractSerializerMaxArrayLength ile güvenli bir okuyucu kullandığında, bu kotadan daha büyük bayt dizilerini seri durumdan çıkarmaz.
MaxBytesPerRead Int32.MaxValue Okuma başına döndürülen izin verilen maksimum bayt sayısını alır ve ayarlar. Bu kota, öğe başlangıç etiketini ve özniteliklerini okurken tek bir Okuma işleminde okunan bayt sayısını sınırlar. (Akışsız durumlarda, öğe adının kendisi kotaya göre sayılmaz). Öznitelik adlarının benzersiz olup olmadığı denetlenmesi gerektiğinden, çok fazla XML özniteliğine sahip olmak orantısız işlem süresini kullanabilir. MaxBytesPerRead bu tehdidi azaltır.
MaxDepth 128 düğüm derinliğinde Bu kota, XML öğelerinin iç içe yerleştirme derinliği üst sınırını sınırlar. MaxDepth ile MaxBytesPerReadetkileşim kurar: Okuyucu, geçerli öğe ve tüm üst öğeleri için verileri her zaman bellekte tutar, bu nedenle okuyucunun en fazla bellek tüketimi bu iki ayarın çarpımıyla orantılıdır. İç içe geçmiş bir nesne grafiği seri durumundan çıkarılırken, seri durumdan çıkartıcı tüm yığına erişmek ve kurtarılamaz bir StackOverflowException ortaya çıkarmak zorunda kalır. XML iç içe geçişi ve nesne iç içe geçişi arasında, gerek DataContractSerializer gerekse XmlSerializer için doğrudan bir bağıntı vardır. MaxDepth bu tehdidi azaltmak için kullanılır.
MaxNameTableCharCount Int32.MaxValue Bu kota, bir ad tablosuna izin verilen en fazla karakter sayısını sınırlar. Ad tablosu, xml belgesi işlenirken karşılaşılan belirli dizeleri (ad alanları ve ön ekler gibi) içerir. Veri akışı beklenirken dizeler bellekte arabelleğe alındığından, aşırı arabelleğe almayı önlemek için bu kota kullanılır.
MaxStringContentLength Int32.MaxValue Bu kota, XML okuyucusunun döndürdüğü en büyük dize boyutunu sınırlar. Bu kota, XML okuyucunun kendisinde değil, okuyucuyu kullanan bileşende bellek tüketimini sınırlamaz. Örneğin, DataContractSerializer bir okuyucu, MaxStringContentLength ile güvence altına alındığında, bu kotadan daha büyük dizeleri seri hale getirmez.

Önemli

Verilerinizin güvenliğini sağlama hakkında daha fazla bilgi için Veriler için Güvenlik Konuları'nın altında "XML'yi Güvenli Bir Şekilde Kullanma" konusuna bakın.

Uyarı

Bu yeni varsayılanlar yalnızca WCF hizmetini .NET Framework 4.5 yüklü bir makineye dağıttığınızda kullanılır. .NET Framework 4.0 ile bir makinede aynı hizmeti dağıtırsanız, .NET Framework 4.0 varsayılanları kullanılır. Böyle durumlarda bu ayarların açıkça yapılandırılması önerilir.

WCF Yapılandırma Doğrulaması

Visual Studio'da derleme işleminin bir parçası olarak, WCF yapılandırma dosyaları artık doğrulanır. Doğrulama başarısız olursa Visual Studio'da doğrulama hatalarının veya uyarılarının listesi görüntülenir.

XML Düzenleyicisi Araç İpuçları

Yeni ve mevcut WCF hizmeti geliştiricilerinin hizmetlerini yapılandırmalarına yardımcı olmak için, Visual Studio XML düzenleyicisi artık hizmet yapılandırma dosyasının parçası olan her yapılandırma öğesi ve özellikleri için araç ipuçları sağlar.

TemelHttpBinding Geliştirmeleri

  1. Tek bir WCF uç noktasının farklı kimlik doğrulama modlarına yanıt vermesini sağlar.

  2. WCF hizmetinin güvenlik ayarlarının IIS tarafından denetlenmesini sağlar