WCF-vereenvoudigingsfuncties
In dit onderwerp worden nieuwe functies besproken die het schrijven van WCF-toepassingen eenvoudiger maken.
gRPC als alternatief voor WCF
gRPC is een modern RPC-framework dat een populair alternatief is voor WCF. gRPC is gebouwd op HTTP/2, wat een aantal voordelen biedt ten opzichte van WCF, waaronder:
- Prestaties: gRPC is veel efficiënter dan WCF, met name voor langlopende verbindingen.
- Schaalbaarheid: gRPC is ontworpen om te schalen naar grote aantallen clients en servers.
- Beveiliging: gRPC ondersteunt verschillende beveiligingsmechanismen, waaronder TLS en verificatie.
- Platformoverschrijdend: gRPC is platformneutraal en kan worden gebruikt met verschillende programmeertalen.
Zie voor meer informatie over het ontwikkelen of migreren van WCF-apps naar gRPC:
- Waarom raden we gRPC aan voor WCF-ontwikkelaars
- WCF vergelijken met gRPC
- Inleiding tot gRPC voor WCF-ontwikkelaars
Vereenvoudigde gegenereerde configuratiebestanden
Wanneer u een servicereferentie toevoegt in Visual Studio of het hulpprogramma SvcUtil.exe gebruikt, wordt er een clientconfiguratiebestand gegenereerd. In eerdere versies van WCF bevatten deze configuratiebestanden de waarde van elke bindingseigenschap, zelfs als de waarde de standaardwaarde is. In WCF 4.5 bevatten de gegenereerde configuratiebestanden alleen de bindingseigenschappen die zijn ingesteld op een niet-standaardwaarde.
Hier volgt een voorbeeld van een configuratiebestand dat is gegenereerd door 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>
Hier volgt een voorbeeld van hetzelfde configuratiebestand dat is gegenereerd door 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 biedt nu ondersteuning voor contract-first-ontwikkeling. Het hulpprogramma svcutil.exe heeft een /serviceContract-switch waarmee u service- en gegevenscontracten kunt genereren vanuit een WSDL-document.
Servicereferentie toevoegen vanuit een draagbaar subsetproject
Met draagbare subsetprojecten kunnen .NET-assemblyprogrammeurs één bronstructuur en buildsysteem onderhouden terwijl ze nog steeds meerdere .NET-implementaties ondersteunen (desktop, Silverlight, Windows Telefoon en Xbox). Draagbare subsetprojecten verwijzen alleen naar .NET portable libraries die assembly's zijn die kunnen worden gebruikt voor elke .NET-implementatie. De ontwikkelaarservaring is hetzelfde als het toevoegen van een servicereferentie in een andere WCF-clienttoepassing. Zie Servicereferentie toevoegen in een draagbaar subsetproject voor meer informatie.
ASP.NET compatibiliteitsmodus standaard gewijzigd
WCF biedt ASP.NET compatibiliteitsmodus om ontwikkelaars volledige toegang te verlenen tot de functies in de ASP.NET HTTP-pijplijn bij het schrijven van WCF-services. Als u deze modus wilt gebruiken, moet u het aspNetCompatibilityEnabled
kenmerk instellen op true in de <sectie serviceHostingEnvironment> van web.config. Daarnaast moet elke service in dit appDomain de RequirementsMode
eigenschap hebben ingesteld Allowed op AspNetCompatibilityRequirementsAttribute of Required. AspNetCompatibilityRequirementsAttribute De standaardinstelling is nu ingesteld op Allowed en de standaard WCF-servicetoepassingssjabloon stelt het aspNetCompatibilityEnabled
kenmerk in op true
. Zie Wat is er nieuw in Windows Communication Foundation 4.5 en WCF Services en ASP.NET voor meer informatie.
Streamingverbeteringen
Er is nieuwe ondersteuning toegevoegd voor asynchrone streaming aan WCF. Als u asynchrone streaming wilt inschakelen, voegt u het DispatcherSynchronizationBehavior eindpuntgedrag toe aan de servicehost en stelt u de eigenschap in AsynchronousSendEnabled op
true
. Dit kan de schaalbaarheid ten goede komen wanneer een service gestreamde berichten verzendt naar meerdere clients die langzaam lezen. WCF blokkeert niet meer één thread per client en maakt de thread vrij voor een andere client.Beperkingen voor het bufferen van berichten zijn verwijderd wanneer een service wordt gehost door IIS. In eerdere versies van WCF bij het ontvangen van een bericht voor een iis-gehoste service die streamingberichtoverdracht gebruikte, zou ASP.NET het hele bericht bufferen voordat het naar WCF wordt verzonden. Dit zou leiden tot een groot geheugenverbruik. Deze buffering is verwijderd in .NET Framework 4.5 en nu kunnen IIS-gehoste WCF-services beginnen met het verwerken van de binnenkomende stroom voordat het hele bericht is ontvangen, waardoor true streaming mogelijk is. Hierdoor kan WCF onmiddellijk reageren op berichten en worden de prestaties verbeterd. Daarnaast hoeft u geen waarde meer op te geven voor
maxRequestLength
de ASP.NET groottelimiet voor binnenkomende aanvragen. Als deze eigenschap is ingesteld, wordt deze genegeerd. Zie httpRuntime-configuratie-element voor meer informatiemaxRequestLength
<.> U moet de maxAllowedContentLength nog steeds configureren. Zie IIS-aanvraaglimieten voor meer informatie.
Nieuwe standaardwaarden voor transport
In de volgende tabel worden de instellingen beschreven die zijn gewijzigd en waar u aanvullende informatie kunt vinden.
Eigenschappen | Uit | Nieuwe standaardwaarde | Meer informatie |
---|---|---|---|
channelInitializationTimeout | NetTcpBinding | 30 seconden | Deze eigenschap bepaalt hoe lang een TCP-verbinding kan duren om zichzelf te verifiëren met behulp van het .NET-frameprotocol. Een client moet enkele initiële gegevens verzenden voordat de server voldoende informatie heeft om verificatie uit te voeren. Deze time-out wordt opzettelijk kleiner gemaakt dan de ReceiveTimeout (10 minuten), zodat kwaadwillende niet-geverifieerde clients de verbindingen niet lang aan de server koppelen. De standaardwaarde is 30 seconden. Voor meer informatie over ChannelInitializationTimeout |
listenBacklog | NetTcpBinding | 16 * aantal processors | Met deze eigenschap op socketniveau wordt het aantal aanvragen voor accepteren in de wachtrij beschreven. Als de backlogwachtrij van de listen vol raakt, worden nieuwe socketaanvragen geweigerd. Voor meer informatie over ListenBacklog |
maxPendingAccepts | Verbinding maken ionOrientedTransportBindingElement SMSvcHost.exe |
2 * aantal verwerkers voor transport 4 * aantal processors voor SMSvcHost.exe |
Deze eigenschap beperkt het aantal kanalen dat de server op een listener kan hebben. Wanneer MaxPendingAccepts te laag is, is er een klein tijdsinterval waarin alle wachtende kanalen zijn begonnen met het onderhouden van verbindingen, maar er zijn geen nieuwe kanalen begonnen met luisteren. Een verbinding kan tijdens dit interval binnenkomen en mislukt omdat er niets op de server wacht. Deze eigenschap kan worden geconfigureerd door de MaxPendingConnections eigenschap in te stellen op een groter getal. Zie en configureer de Net.TCP-service voor het delen van poorten voor meer informatie MaxPendingAccepts |
maxPending Verbinding maken ions | Verbinding maken ionOrientedTransportBindingElement | 12 * aantal processors | Deze eigenschap bepaalt hoeveel verbindingen een transport heeft geaccepteerd, maar niet zijn opgehaald door de ServiceModel Dispatcher. Als u deze waarde wilt instellen, gebruikt MaxConnections u deze voor de binding of maxOutboundConnectionsPerEndpoint voor het bindingselement. Voor meer informatie over MaxPendingConnections |
receiveTimeout | SMSvcHost.exe | 30 seconden | Deze eigenschap geeft de time-out op voor het lezen van de TCP-framegegevens en het verzenden van verbindingen vanaf de onderliggende verbindingen. Dit bestaat om een limiet in te stellen voor de hoeveelheid tijd SMSvcHost.exe service wordt ingeschakeld om de preambule gegevens van een binnenkomende verbinding te lezen. Zie De Net.TCP-service voor het delen van poorten configureren voor meer informatie. |
Notitie
Deze nieuwe standaardwaarden worden alleen gebruikt als u de WCF-service implementeert op een computer met .NET Framework 4.5. Als u dezelfde service implementeert op een computer met .NET Framework 4.0, worden de standaardinstellingen van .NET Framework 4.0 gebruikt. In dergelijke gevallen wordt u aangeraden deze instellingen expliciet te configureren.
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas bevat configureerbare quotumwaarden voor XML-woordenlijstlezers die de hoeveelheid geheugen beperken die door een encoder wordt gebruikt tijdens het maken van een bericht. Hoewel deze quota kunnen worden geconfigureerd, zijn de standaardwaarden gewijzigd om de mogelijkheid te verminderen dat een ontwikkelaar deze expliciet moet instellen. MaxReceivedMessageSize
het quotum is niet gewijzigd, zodat het geheugenverbruik nog steeds kan beperken, waardoor u niet hoeft om te gaan met de complexiteit van de XmlDictionaryReaderQuotas. In de volgende tabel ziet u de quota, de nieuwe standaardwaarden en een korte uitleg van waarvoor elk quotum wordt gebruikt.
Quotumnaam | Standaardwaarde | Beschrijving |
---|---|---|
MaxArrayLength | Int32.MaxValue | Hiermee haalt u de maximaal toegestane matrixlengte op en stelt u deze in. Dit quotum beperkt de maximale grootte van een matrix met primitieven die de XML-lezer retourneert, inclusief bytematrices. Dit quotum beperkt het geheugenverbruik in de XML-lezer zelf niet, maar in elk onderdeel dat de lezer gebruikt. Wanneer de DataContractSerializer gebruiker bijvoorbeeld een lezer gebruikt die is beveiligd met MaxArrayLength, wordt bytematrices die groter zijn dan dit quotum, niet gedeserialiseerd. |
MaxBytesPerRead | Int32.MaxValue | Hiermee worden de maximaal toegestane bytes opgehaald en ingesteld die voor elke leesbewerking zijn geretourneerd. Dit quotum beperkt het aantal bytes dat in één leesbewerking wordt gelezen bij het lezen van de tag start van het element en de bijbehorende kenmerken. (In niet-gestreamde gevallen wordt de elementnaam zelf niet meegeteld voor het quotum). Het gebruik van te veel XML-kenmerken kan onevenredige verwerkingstijd in gebruik hebben, omdat kenmerknamen moeten worden gecontroleerd op uniekheid. MaxBytesPerRead vermindert deze bedreiging. |
MaxDepth | 128 knooppunten diep | Dit quotum beperkt de maximale nestdiepte van XML-elementen. MaxDepth communiceert met MaxBytesPerRead: de lezer bewaart altijd gegevens in het geheugen voor het huidige element en alle bovenliggende elementen, zodat het maximale geheugenverbruik van de lezer evenredig is met het product van deze twee instellingen. Wanneer deserialiseren van een diep geneste objectgrafiek, wordt de deserializer gedwongen toegang te krijgen tot de hele stack en een onherstelbaar StackOverflowExceptionte gooien. Er bestaat een directe correlatie tussen XML-nesting en object genest voor zowel de DataContractSerializer als de XmlSerializer. MaxDepth wordt gebruikt om deze bedreiging te beperken. |
MaxNameTableCharCount | Int32.MaxValue | Dit quotum beperkt het maximum aantal tekens dat is toegestaan in een naamtabel. De naamtabel bevat bepaalde tekenreeksen (zoals naamruimten en voorvoegsels) die worden aangetroffen bij het verwerken van een XML-document. Omdat deze tekenreeksen in het geheugen worden gebufferd, wordt dit quotum gebruikt om overmatige buffering te voorkomen wanneer streaming wordt verwacht. |
MaxStringContentLength | Int32.MaxValue | Dit quotum beperkt de maximale tekenreeksgrootte die de XML-lezer retourneert. Dit quotum beperkt het geheugenverbruik niet in de XML-lezer zelf, maar in het onderdeel dat de lezer gebruikt. Als de DataContractSerializer gebruiker bijvoorbeeld een lezer gebruikt die is beveiligd met MaxStringContentLength, worden tekenreeksen die groter zijn dan dit quotum niet gedeserialiseerd. |
Belangrijk
Raadpleeg 'XML veilig gebruiken' onder Beveiligingsoverwegingen voor gegevens voor meer informatie over het beveiligen van uw gegevens.
Notitie
Deze nieuwe standaardwaarden worden alleen gebruikt als u de WCF-service implementeert op een computer met .NET Framework 4.5. Als u dezelfde service implementeert op een computer met .NET Framework 4.0, worden de standaardinstellingen van .NET Framework 4.0 gebruikt. In dergelijke gevallen wordt u aangeraden deze instellingen expliciet te configureren.
WCF-configuratievalidatie
Als onderdeel van het buildproces in Visual Studio worden WCF-configuratiebestanden nu gevalideerd. Er wordt een lijst met validatiefouten of waarschuwingen weergegeven in Visual Studio als de validatie mislukt.
Knopinfo voor XML-editor
Om nieuwe en bestaande WCF-serviceontwikkelaars te helpen hun services te configureren, biedt de Xml-editor van Visual Studio nu knopinfo voor elk configuratie-element en de eigenschappen ervan die deel uitmaken van het serviceconfiguratiebestand.
BasicHttpBinding-verbeteringen
Hiermee kan één WCF-eindpunt reageren op verschillende verificatiemodi.
Hiermee kunnen de beveiligingsinstellingen van een WCF-service worden beheerd door IIS