Dela via


WCF-förenklingsfunktioner

I det här avsnittet beskrivs nya funktioner som gör det enklare att skriva WCF-program.

gRPC som ett alternativ till WCF

gRPC är ett modernt RPC-ramverk som är ett populärt alternativ till WCF. gRPC bygger på HTTP/2, vilket ger ett antal fördelar jämfört med WCF, inklusive:

  • Prestanda: gRPC är mycket effektivare än WCF, särskilt för långvariga anslutningar.
  • Skalbarhet: gRPC är utformat för att skala till ett stort antal klienter och servrar.
  • Säkerhet: gRPC stöder en mängd olika säkerhetsmekanismer, inklusive TLS och autentisering.
  • Plattformsoberoende: gRPC är plattformsneutralt och kan användas med en mängd olika programmeringsspråk.

Mer information om hur du utvecklar eller migrerar WCF-appar till gRPC finns i:

Förenklade genererade konfigurationsfiler

När du lägger till en tjänstreferens i Visual Studio eller använder verktyget SvcUtil.exe genereras en klientkonfigurationsfil. I tidigare versioner av WCF innehöll dessa konfigurationsfiler värdet för varje bindningsegenskap även om dess värde är standardvärdet. I WCF 4.5 innehåller de genererade konfigurationsfilerna endast de bindningsegenskaper som är inställda på ett icke-standardvärde.

Följande är ett exempel på en konfigurationsfil som genereras av 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>

Följande är ett exempel på samma konfigurationsfil som genereras av 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 har nu stöd för kontrakt-första utveckling. Verktyget svcutil.exe har en /serviceContract-växel som gör att du kan generera tjänst- och datakontrakt från ett WSDL-dokument.

Lägg till tjänstreferens från ett portabelt delmängdsprojekt

Portabla delmängdsprojekt gör det möjligt för .NET-monteringsprogram att underhålla ett enda källträd och byggsystem samtidigt som de stöder flera .NET-implementeringar (skrivbord, Silverlight, Windows Telefon och Xbox). Portabla delmängdsprojekt refererar endast till bärbara .NET-bibliotek som är sammansättningar som kan användas i alla .NET-implementeringar. Utvecklarupplevelsen är densamma som att lägga till en tjänstreferens i andra WCF-klientprogram. Mer information finns i Lägg till tjänstreferens i ett portabelt delmängdsprojekt.

standardinställningen för ASP.NET kompatibilitetsläge har ändrats

WCF tillhandahåller ASP.NET kompatibilitetsläge för att ge utvecklare fullständig åtkomst till funktionerna i ASP.NET HTTP-pipeline när de skriver WCF-tjänster. Om du vill använda det här läget måste du ange aspNetCompatibilityEnabled attributet till true i <avsnittet serviceHostingEnvironment> i web.config. Dessutom måste alla tjänster i den här appenDomain ha RequirementsMode egenskapen inställd AllowedAspNetCompatibilityRequirementsAttribute eller Required. Som standard AspNetCompatibilityRequirementsAttribute är nu inställt på Allowed och standardmallen för WCF-tjänstprogram anger aspNetCompatibilityEnabled attributet till true. Mer information finns i Nyheter i Windows Communication Foundation 4.5 och WCF Services och ASP.NET.

Förbättringar av direktuppspelning

  • Nytt stöd för asynkron strömning har lagts till i WCF. Om du vill aktivera asynkron direktuppspelning lägger du till DispatcherSynchronizationBehavior slutpunktsbeteendet till tjänstvärden och anger dess AsynchronousSendEnabled egenskap till true. Detta kan gynna skalbarheten när en tjänst skickar strömmade meddelanden till flera klienter som läser långsamt. WCF blockerar inte längre en tråd per klient och frigör tråden för att betjäna en annan klient.

  • Begränsningar kring buffring av meddelanden när en tjänst är IIS-värd har tagits bort. I tidigare versioner av WCF när du tog emot ett meddelande för en IIS-värdbaserad tjänst som använde överföring av strömmande meddelanden skulle ASP.NET buffra hela meddelandet innan det skickades till WCF. Detta skulle orsaka stor minnesförbrukning. Den här buffring har tagits bort i .NET Framework 4.5 och nu kan IIS-värdbaserade WCF-tjänster börja bearbeta den inkommande strömmen innan hela meddelandet har tagits emot, vilket möjliggör sann direktuppspelning. Detta gör att WCF kan svara omedelbart på meddelanden och ger bättre prestanda. Dessutom behöver du inte längre ange ett värde för maxRequestLength, ASP.NET storleksgräns för inkommande begäranden. Om den här egenskapen har angetts ignoreras den. Mer information finns maxRequestLength i <konfigurationselementet httpRuntime>. Du måste fortfarande konfigurera maxAllowedContentLength. Mer information finns i IIS-begärandegränser.

Nya standardvärden för transport

I följande tabell beskrivs de inställningar som har ändrats och var du hittar ytterligare information.

Property Ny standard Mer information
channelInitializationTimeout NetTcpBinding 30 sekunder Den här egenskapen avgör hur lång tid det kan ta för en TCP-anslutning att autentisera sig själv med hjälp av .NET Framing-protokollet. En klient måste skicka vissa initiala data innan servern har tillräckligt med information för att utföra autentisering. Den här tidsgränsen görs avsiktligt mindre än ReceiveTimeout (10 min) så att skadliga oautentiserade klienter inte håller anslutningarna bundna till servern länge. Standardvärdet är 30 sekunder. Mer information om ChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * antal processorer Den här egenskapen på socketnivå beskriver antalet "väntande accept"-begäranden som ska placeras i kö. Om lyssningskö fylls i avvisas nya socketbegäranden. Mer information om ListenBacklog
maxPendingAccepts Anslut ionOrientedTransportBindingElement

SMSvcHost.exe
2 * antal processorer för transport

4 * antal processorer för SMSvcHost.exe
Den här egenskapen begränsar antalet kanaler som servern kan ha väntar på en lyssnare. När MaxPendingAccepts är för lågt finns det ett litet tidsintervall där alla väntande kanaler har börjat underhålla anslutningar, men inga nya kanaler har börjat lyssna. En anslutning kan tas emot under det här intervallet och misslyckas eftersom ingenting väntar på den på servern. Den här egenskapen kan konfigureras genom att ställa in egenskapen MaxPendingConnections på ett större tal. Mer information finns i MaxPendingAccepts och Konfigurera Net.TCP-portdelningstjänsten
maxPending Anslut ions Anslut ionOrientedTransportBindingElement 12 * antal processorer Den här egenskapen styr hur många anslutningar en transport har accepterat men inte har hämtats av ServiceModel Dispatcher. Om du vill ange det här värdet använder du MaxConnections bindningen eller maxOutboundConnectionsPerEndpoint bindningselementet. Mer information om MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 sekunder Den här egenskapen anger tidsgränsen för att läsa TCP-inramningsdata och utföra anslutningssändning från de underliggande anslutningarna. Detta finns för att sätta ett tak för hur lång tid SMSvcHost.exe tjänsten hålls engagerad för att läsa ingressdata från en inkommande anslutning. Mer information finns i Konfigurera Net.TCP-portdelningstjänsten.

Kommentar

Dessa nya standardvärden används endast om du distribuerar WCF-tjänsten på en dator med .NET Framework 4.5. Om du distribuerar samma tjänst på en dator med .NET Framework 4.0 används standardinställningarna för .NET Framework 4.0. I sådana fall rekommenderar vi att du konfigurerar de här inställningarna explicit.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas innehåller konfigurerbara kvotvärden för XML-ordlisteläsare som begränsar mängden minne som används av en kodare när ett meddelande skapas. Även om dessa kvoter kan konfigureras har standardvärdena ändrats för att minska risken för att en utvecklare måste ange dem explicit. MaxReceivedMessageSize kvoten har inte ändrats så att den fortfarande kan begränsa minnesförbrukningen, vilket förhindrar att du behöver hantera komplexiteten i XmlDictionaryReaderQuotas. I följande tabell visas kvoterna, deras nya standardvärden och en kort förklaring av vad varje kvot används för.

Kvotnamn Standardvärde beskrivning
MaxArrayLength Int32.MaxValue Hämtar och anger den maximala tillåtna matrislängden. Den här kvoten begränsar den maximala storleken på en matris med primitiver som XML-läsaren returnerar, inklusive bytematriser. Den här kvoten begränsar inte minnesförbrukningen i själva XML-läsaren, utan i den komponent som använder läsaren. När en läsare som skyddas med MaxArrayLengthanvänds till exempel DataContractSerializer inte deserialisera bytematriser som är större än den här kvoten.
MaxBytesPerRead Int32.MaxValue Hämtar och anger maximalt antal tillåtna byte som returneras för varje läsning. Den här kvoten begränsar antalet byte som läss i en enda läsåtgärd när du läser elementets starttagg och dess attribut. (I icke-strömmade fall räknas inte själva elementnamnet mot kvoten). Om du har för många XML-attribut kan det ta upp oproportionerlig bearbetningstid eftersom attributnamn måste kontrolleras för unikhet. MaxBytesPerRead minimerar det här hotet.
MaxDepth 128 noder djup Den här kvoten begränsar det maximala kapslingsdjupet för XML-element. MaxDepth interagerar med MaxBytesPerRead: läsaren behåller alltid data i minnet för det aktuella elementet och alla dess överordnade element, så den maximala minnesförbrukningen för läsaren är proportionell mot produkten av dessa två inställningar. När du deserialiserar ett djupt kapslat objektdiagram tvingas deserialiseraren att komma åt hela stacken och utlösa en oåterkallelig StackOverflowException. Det finns en direkt korrelation mellan XML-kapsling och objektkapsling för både DataContractSerializer och XmlSerializer. MaxDepth används för att minimera det här hotet.
MaxNameTableCharCount Int32.MaxValue Den här kvoten begränsar det maximala antalet tecken som tillåts i en namntabell. Namntabellen innehåller vissa strängar (till exempel namnområden och prefix) som påträffas när ett XML-dokument bearbetas. Eftersom dessa strängar buffras i minnet används den här kvoten för att förhindra överdriven buffring när direktuppspelning förväntas.
MaxStringContentLength Int32.MaxValue Den här kvoten begränsar den maximala strängstorlek som XML-läsaren returnerar. Den här kvoten begränsar inte minnesförbrukningen i själva XML-läsaren, utan i komponenten som använder läsaren. Till exempel när DataContractSerializer använder en läsare som skyddas med MaxStringContentLength, deserialisera inte strängar som är större än den här kvoten.

Viktigt!

Mer information om hur du skyddar dina data finns i "Använda XML Valv ly" under Säkerhetsöverväganden för data.

Kommentar

Dessa nya standardvärden används endast om du distribuerar WCF-tjänsten på en dator med .NET Framework 4.5. Om du distribuerar samma tjänst på en dator med .NET Framework 4.0 används standardinställningarna för .NET Framework 4.0. I sådana fall rekommenderar vi att du konfigurerar de här inställningarna explicit.

Verifiering av WCF-konfiguration

Som en del av byggprocessen i Visual Studio verifieras nu WCF-konfigurationsfiler. En lista över valideringsfel eller varningar visas i Visual Studio om verifieringen misslyckas.

Knappbeskrivningar för XML-redigeraren

För att hjälpa nya och befintliga WCF-tjänstutvecklare att konfigurera sina tjänster tillhandahåller Visual Studio XML-redigeraren nu knappbeskrivningar för varje konfigurationselement och dess egenskaper som ingår i tjänstkonfigurationsfilen.

BasicHttpBinding-förbättringar

  1. Gör att en enda WCF-slutpunkt kan svara på olika autentiseringslägen.

  2. Gör att en WCF-tjänsts säkerhetsinställningar kan styras av IIS