Sdílet prostřednictvím


Funkce zjednodušení WCF

Toto téma popisuje nové funkce, které usnadňují psaní aplikací WCF.

gRPC jako alternativa k WCF

gRPC je moderní architektura RPC, která je oblíbenou alternativou wcf. GRPC je postaven na http/2, která poskytuje řadu výhod oproti WCF, včetně:

  • Výkon: gRPC je mnohem efektivnější než WCF, zejména pro dlouhotrvající připojení.
  • Škálovatelnost: GRPC je navržená tak, aby se škáluje na velký počet klientů a serverů.
  • Zabezpečení: gRPC podporuje celou řadu mechanismů zabezpečení, včetně protokolu TLS a ověřování.
  • Multiplatformní: gRPC je platformově neutrální a dá se použít s různými programovacími jazyky.

Další informace o vývoji nebo migraci aplikací WCF do gRPC najdete tady:

Zjednodušené generované konfigurační soubory

Když v sadě Visual Studio přidáte odkaz na službu nebo použijete nástroj SvcUtil.exe, vygeneruje se konfigurační soubor klienta. V předchozích verzích WCF tyto konfigurační soubory obsahovaly hodnotu každé vlastnosti vazby, i když její hodnota je výchozí hodnota. Ve WCF 4.5 generované konfigurační soubory obsahují pouze vlastnosti vazby, které jsou nastaveny na ne-výchozí hodnotu.

Následuje příklad konfiguračního souboru vygenerovaného 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>

Následuje příklad stejného konfiguračního souboru vygenerovaného 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 Development

WCF teď podporuje vývoj založený na kontraktech. Nástroj svcutil.exe má přepínač /serviceContract, který umožňuje generovat služby a datové kontrakty z dokumentu WSDL.

Přidání odkazu na službu z přenosného projektu podmnožina

Přenosné projekty podmnožina umožňují programátorům sestavení .NET udržovat jeden zdrojový strom a systém sestavení a současně podporovat více implementací .NET (desktop, Silverlight, Windows Telefon a Xbox). Přenosné projekty podmnožina odkazují pouze na přenosné knihovny .NET, které jsou sestavení, která lze použít v jakékoli implementaci .NET. Prostředí pro vývojáře je stejné jako přidání odkazu na službu v jakékoli jiné klientské aplikaci WCF. Další informace naleznete v tématu Přidání odkazu na službu v přenosném podmnožině projektu.

Výchozí změna režimu kompatibility ASP.NET

WCF poskytuje ASP.NET režim kompatibility, který vývojářům umožňuje úplný přístup k funkcím v kanálu ASP.NET HTTP při psaní služeb WCF. Chcete-li použít tento režim, je nutné nastavit aspNetCompatibilityEnabled atribut na hodnotu true v <části serviceHostingEnvironment> web.config. Kromě toho každá služba v této appDomain musí mít RequirementsMode vlastnost nastavena na AspNetCompatibilityRequirementsAttributeAllowed nebo Required. Ve výchozím nastavení AspNetCompatibilityRequirementsAttribute je nyní nastavena Allowed a výchozí šablona aplikace služby WCF nastaví aspNetCompatibilityEnabled atribut na true. Další informace naleznete v tématu Co je nového ve Windows Communication Foundation 4.5 a WCF Services a ASP.NET.

Vylepšení streamování

  • Do WCF byla přidána nová podpora asynchronního streamování. Pokud chcete povolit asynchronní streamování, přidejte DispatcherSynchronizationBehavior do hostitele služby chování koncového bodu a nastavte jeho AsynchronousSendEnabled vlastnost na true. To může výhodou škálovatelnosti, když služba odesílá streamované zprávy více klientům, kteří čtou pomalu. WCF už neblokuje jedno vlákno na klienta a uvolní vlákno pro službu jiného klienta.

  • Odebraná omezení týkající se ukládání zpráv do vyrovnávací paměti, když je služba hostovaná službou IIS. V předchozíchverzích službě IIS, které používaly přenos streamovaných zpráv, ASP.NET před odesláním do WCF uloží celou zprávu do vyrovnávací paměti. To by způsobilo velké využití paměti. Tato vyrovnávací paměť byla odebrána v rozhraní .NET Framework 4.5 a nyní služby WCF hostované službou IIS mohou začít zpracovávat příchozí datový proud před přijetím celé zprávy, čímž se povolí skutečné streamování. Díky tomu může WCF okamžitě reagovat na zprávy a umožňuje lepší výkon. Kromě toho už nemusíte zadávat hodnotu pro maxRequestLengthASP.NET limit velikosti příchozích požadavků. Pokud je tato vlastnost nastavená, bude ignorována. Další informace o maxRequestLength httpRuntime><configuration element. Stále budete muset nakonfigurovat maxAllowedContentLength, další informace naleznete v tématu Omezení požadavků služby IIS.

Nové výchozí hodnoty přenosu

Následující tabulka popisuje nastavení, která se změnila a kde najít další informace.

Vlastnost Zapnout Nové výchozí Další informace
channelInitializationTimeout NetTcpBinding 30 sekund Tato vlastnost určuje, jak dlouho může trvat ověření připojení TCP pomocí protokolu .NET Framing. Klient musí odeslat několik počátečních dat, aby server získal dostatek informací k ověření. Tento časový limit je záměrně menší než hodnota ReceiveTimeout (10 min), aby neověření klienti se zlými úmysly neudržovali připojení na server dlouhou dobu. Výchozí hodnota je 30 sekund. Další informace o ChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * počet procesorů Tato vlastnost na úrovni soketu popisuje počet požadavků čekajících na přijetí, které se mají zařazuje do fronty. Pokud se fronta backlogu naslouchání vyplní, nové žádosti soketů budou odmítnuty. Další informace o ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * počet procesorů pro přepravu

4 * počet procesorů pro SMSvcHost.exe
Tato vlastnost omezuje počet kanálů, které může server čekat na naslouchací proces. Pokud je hodnota MaxPendingAccepts příliš nízká, bude existovat malý interval, ve kterém všechny čekající kanály začaly obsluhovat připojení, ale žádné nové kanály nezačly naslouchat. Během tohoto intervalu může dojít k připojení, které selže, protože na něj na serveru nic nečeká. Tuto vlastnost lze nakonfigurovat nastavením MaxPendingConnections vlastnosti na větší číslo. Další informace najdete v tématu MaxPendingAccepts a konfiguraci služby Sdílení portů Net.TCP
maxPending Připojení ions ConnectionOrientedTransportBindingElement 12 * počet procesorů Tato vlastnost určuje, kolik připojení přenos přijal, ale nebyl vybrán dispečerem ServiceModel. Chcete-li nastavit tuto hodnotu, použijte MaxConnections pro vazbu nebo maxOutboundConnectionsPerEndpoint pro element vazby. Další informace o MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 sekund Tato vlastnost určuje časový limit pro čtení dat rámování protokolu TCP a provádění odesílání připojení z podkladových připojení. Existuje limit doby, po kterou se služba SMSvcHost.exe bude zasunout ke čtení preambule dat z příchozího připojení. Další informace naleznete v tématu Konfigurace služby Sdílení portů Net.TCP.

Poznámka:

Tyto nové výchozí hodnoty se používají pouze v případě, že službu WCF nasadíte na počítač s rozhraním .NET Framework 4.5. Pokud nasadíte stejnou službu na počítač s rozhraním .NET Framework 4.0, použijí se výchozí hodnoty rozhraní .NET Framework 4.0. V takových případech se doporučuje nakonfigurovat tato nastavení explicitně.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas obsahuje konfigurovatelné hodnoty kvót pro čtečky slovníku XML, které omezují množství paměti využívané kodérem při vytváření zprávy. I když jsou tyto kvóty konfigurovatelné, výchozí hodnoty se změnily tak, aby se snížila možnost, že je vývojář bude muset explicitně nastavit. MaxReceivedMessageSize kvóta nebyla změněna tak, aby stále omezovala spotřebu paměti, což brání tomu, abyste se museli zabývat složitostí XmlDictionaryReaderQuotas. Následující tabulka uvádí kvóty, jejich nové výchozí hodnoty a stručné vysvětlení toho, k čemu se každá kvóta používá.

Název kvóty Výchozí hodnota Popis
MaxArrayLength Int32.maxvalue Získá a nastaví maximální povolenou délku pole. Tato kvóta omezuje maximální velikost pole primitiv, které vrátí čtečka XML, včetně bajtových polí. Tato kvóta neomezuje spotřebu paměti v samotné čtečce XML, ale v jakékoli komponentě, která používá čtečku. Pokud například používá čtečku DataContractSerializer zabezpečenou MaxArrayLengthpomocí , nezkonstruuje pole bajtů větší než tato kvóta.
MaxBytesPerRead Int32.maxvalue Získá a nastaví maximální povolené bajty vrácené pro každé čtení. Tato kvóta omezuje počet bajtů, které se čtou v rámci jedné operace čtení při čtení počáteční značky elementu a jeho atributů. (V jiných než streamovaných případech se název samotného prvku nezapočítává do kvóty). Příliš mnoho atributů XML může využívat nepřiměřenou dobu zpracování, protože názvy atributů je nutné zkontrolovat jedinečnost. MaxBytesPerRead snižuje tuto hrozbu.
MaxDepth 128 uzlů hluboko Tato kvóta omezuje maximální hloubku vnoření elementů XML. MaxDepth komunikuje s MaxBytesPerRead: čtenář vždy uchovává data v paměti pro aktuální prvek a všechny jeho nadřazené prvky, takže maximální spotřeba paměti čtenáře je úměrná součinu těchto dvou nastavení. Při deserializaci hluboko vnořeného objektového grafu je deserializátor nucen přistupovat k celému zásobníku a vyvolat neopravitelný StackOverflowException. Přímá korelace existuje mezi vnořením XML a vnořením objektů pro objekt i DataContractSerializerXmlSerializerpro . MaxDepth se používá ke zmírnění této hrozby.
MaxNameTableCharCount Int32.maxvalue Tato kvóta omezuje maximální počet znaků povolených v názvové tabulce. Názvová tabulka obsahuje určité řetězce (například obory názvů a předpony), ke kterým dochází při zpracování dokumentu XML. Vzhledem k tomu, že se tyto řetězce ukládají do vyrovnávací paměti, tato kvóta se používá k zabránění nadměrnému ukládání do vyrovnávací paměti při očekávaném streamování.
MaxStringContentLength Int32.maxvalue Tato kvóta omezuje maximální velikost řetězce, kterou vrátí čtečka XML. Tato kvóta neomezuje spotřebu paměti v samotné čtečce XML, ale v komponentě, která používá čtečku. Pokud například DataContractSerializer používá čtečku zabezpečenou MaxStringContentLengthpomocí , ne deserializuje řetězce větší než tato kvóta.

Důležité

Další informace o zabezpečení dat najdete v tématu Použití xml Sejf ly v tématu Důležité informace o zabezpečení dat.

Poznámka:

Tyto nové výchozí hodnoty se používají pouze v případě, že službu WCF nasadíte na počítač s rozhraním .NET Framework 4.5. Pokud nasadíte stejnou službu na počítač s rozhraním .NET Framework 4.0, použijí se výchozí hodnoty rozhraní .NET Framework 4.0. V takových případech se doporučuje nakonfigurovat tato nastavení explicitně.

Ověřování konfigurace WCF

V rámci procesu sestavení v sadě Visual Studio se teď ověřují konfigurační soubory WCF. V sadě Visual Studio se zobrazí seznam chyb nebo upozornění ověření, pokud se ověření nezdaří.

Popisy editoru XML

Editor XML sady Visual Studio teď poskytuje popisy pro každý element konfigurace a jeho vlastnosti, které jsou součástí konfiguračního souboru služby.

Vylepšení BasicHttpBinding

  1. Umožňuje jednomu koncovému bodu WCF reagovat na různé režimy ověřování.

  2. Umožňuje řízení nastavení zabezpečení služby WCF službou IIS.