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 Vývoj

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 projektu přenositelné podmnožiny

Projekty přenosných podmnožin umožňují programátorům sestavení .NET udržovat jeden zdrojový strom a systém sestavování, přičemž stále podporují více implementací .NET (desktop, Silverlight, Windows Phone a Xboxem). Projekty přenosné podmnožiny odkazují pouze na přenosné knihovny .NET, 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 projektu podmnožiny.

Změna výchozího 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 atribut aspNetCompatibilityEnabled na true v části <serviceHostingEnvironment> web.config. Kromě toho musí mít každá služba v této aplikační doméně vlastnost RequirementsMode nastavenu na AspNetCompatibilityRequirementsAttribute, Allowed nebo Required. Ve výchozím nastavení je nyní AspNetCompatibilityRequirementsAttribute nastavena na Allowed a výchozí šablona aplikace služby WCF nastavuje atribut aspNetCompatibilityEnabled 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 chování koncového bodu DispatcherSynchronizationBehavior do hostitele služby a nastavte jeho vlastnost AsynchronousSendEnabled na true. To může být přínosem pro škálovatelnost, když služba odesílá streamované zprávy více klientům, kteří čtou pomaleji. 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. Ve starších verzích WCF, při přijímání zprávy pro službu hostovanou v IIS, která používala přenos streamovaných zpráv, ASP.NET nejprve uložil celou zprávu do vyrovnávací paměti, než ji odeslal do WCF. 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 najdete v konfiguračním prvku <httpRuntime>. Stále budete muset nakonfigurovat maxAllowedContentLength, další informace naleznete v tématu Omezení požadavků služby IIS.

Nové výchozí hodnoty pro přenos dat

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

Vlastnictví Na Nové výchozí Další informace
časový limit inicializace kanálu 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
Poslech backlogu 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 požadavků na naslouchání zaplní, nové žádosti o socket budou odmítnuty. Další informace o ListenBacklog
maxPendingAccepts ElementSběruPropojenéhoTransportu

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 mít čekající na naslouchadlo. 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 Konfigurování služby Sdílení portů Net.TCP
Maximální počet čekajících spojení ElementSběruPropojenéhoTransportu 12 * počet procesorů Tato vlastnost určuje, kolik připojení přenos přijal, ale ještě nebylo zpracováno 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í. Slouží k tomu, aby se omezila doba, po kterou je služba SMSvcHost.exe využívána k čtení preambulových 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 (limity čtečky slovníku XML)

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. Například, když DataContractSerializer používá čtečku zabezpečenou pomocí MaxArrayLength, nedeserializuje 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 spotřebovat nepřiměřeně mnoho času na zpracování, protože je nutné zkontrolovat jedinečnost názvů atributů. 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ů jak pro DataContractSerializer, tak pro XmlSerializer. 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 pomocí MaxStringContentLength, nedeserializuje řetězce větší než tato kvóta.

Důležité

Další informace o zabezpečení dat najdete v části Používání XML bezpečně v části 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. Ve Visual Studiu se zobrazí seznam chyb nebo upozornění ověření, pokud se ověření nezdaří.

Nápovědy pro editor XML

Pro usnadnění konfigurace služeb novým a stávajícím vývojářům služeb WCF nyní editor XML ve Visual Studio poskytuje popisy pro každý konfigurační prvek a jeho vlastnosti v konfiguračním souboru služby.

Vylepšení technologie 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.