WCF-VereinfachungsfunktionenWCF Simplification Features

In diesem Thema werden neue Funktionen erörtert, die das Schreiben von WCF-Anwendungen vereinfachen.This topic discusses new features that make writing WCF applications simpler.

Vereinfachte generierte KonfigurationsdateienSimplified Generated Configuration Files

Wenn Sie einen Dienstverweis in Visual Studio hinzufügen oder das SvcUtil.exe-Tool verwenden, wird eine Clientkonfigurationsdatei generiert.When you add a service reference in Visual Studio or use the SvcUtil.exe tool a client configuration file is generated. In früheren Versionen von WCF enthielten diese Konfigurationsdateien den Wert jeder Bindungseigenschaft, auch wenn deren Wert dem Standardwert entsprach.In previous versions of WCF these configuration files contained the value of every binding property even if its value is the default value. In WCF 4.5 enthalten die generierten Konfigurationsdateien nur die Bindungseigenschaften, die auf einen nicht standardmäßigen Wert festgelegt sind.In WCF 4.5 the generated configuration files contain only those binding properties that are set to a non-default value.

Im folgenden Beispiel wird eine mit WCF 3.0 generierte Konfigurationsdatei gezeigt.The following is an example of a configuration file generated by 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>  

Im folgenden Beispiel wird eine mit WCF 4.5 generierte Konfigurationsdatei gezeigt.The following is an example of the same configuration file generated by 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>  

Vertrag zuerst-EntwicklungContract-First Development

WCF unterstützt jetzt die Vertrag zuerst-Entwicklung.WCF now has support for contract-first development. Das svcutl.exe-Tool verfügt über einen /serviceContract-Schalter, der das Generieren von Dienst- und Datenverträgen von einem WSDL-Dokument ermöglicht.The svcutl.exe tool has a /serviceContract switch which allows you to generate service and data contracts from a WSDL document.

Hinzufügen eines Dienstverweises aus einem Projekt für die portable TeilmengeAdd Service Reference From a Portable Subset Project

Projekte für Portable Teilmengen ermöglichen es Programmierern .NET-Assemblys, eine einzelne Quellstruktur zu verwalten und das System mit Unterstützung mehrerer .NET-Implementierungen (Desktop, Silverlight, Windows Phone und XBOX) aufzubauen.Portable subset projects enable .NET assembly programmers to maintain a single source tree and build system while still supporting multiple .NET implementations (desktop, Silverlight, Windows Phone, and XBOX). Projekte für Portable Teilmengen verweisen nur portable .NET-Bibliotheken, die einer .NET Framework-Assembly sind, die für die Implementierung einer .NET verwendet werden kann.Portable subset projects only reference .NET portable libraries which are a .NET framework assembly that can be used on any .NET implementation. Die Entwicklererfahrung ist identisch mit dem Hinzufügen eines Dienstverweises innerhalb einer beliebigen anderen WCF-Clientanwendung.The developer experience is the same as adding a service reference within any other WCF client application. Weitere Informationen finden Sie unterFor more information, seeHinzufügen eines Dienstverweises in einem Projekt für Portable Teilmengen. Add Service Reference in a Portable Subset Project.

Geänderter Standard für den ASP.NET-KompatibilitätsmodusASP.NET Compatibility Mode Default Changed

WCF bietet einen ASP.NET-Kompatibilitätsmodus, der Entwicklern beim Schreiben von WCF-Diensten vollständigen Zugriff auf die Funktionen in der ASP.NET-HTTP-Pipeline gewährt.WCF provides ASP.NET compatibility mode to grant developers full access to the features in the ASP.NET HTTP pipeline when writing WCF services. Um diesen Modus verwenden zu können, müssen Sie festlegen der aspNetCompatibilityEnabled Attribut auf "true" in der <ServiceHostingEnvironment > Abschnitt der Datei "Web.config". Außerdem muss die RequirementsMode-Eigenschaft für jeden Dienst in dieser appDomain für AspNetCompatibilityRequirementsAttribute auf Allowed oder Required festgelegt sein.To use this mode, you must set the aspNetCompatibilityEnabled attribute to true in the <serviceHostingEnvironment> section of web.config. Additionally, any service in this appDomain needs to have the RequirementsMode property on its AspNetCompatibilityRequirementsAttribute set to Allowed or Required. Standardmäßig AspNetCompatibilityRequirementsAttribute ist nun so festgelegt Allowed und die Standardeinstellung WCF service-Anwendung Vorlage legt die aspNetCompatibilityEnabled -Attribut true.By default AspNetCompatibilityRequirementsAttribute is now set to Allowed and the default WCF service application template sets the aspNetCompatibilityEnabled attribute to true. Weitere Informationen finden Sie unterFor more information, seeNeuerungen in Windows Communication Foundation 4.5 und WCF-Dienste und ASP.NET. What's New in Windows Communication Foundation 4.5 and WCF Services and ASP.NET.

Verbesserungen beim StreamingStreaming Improvements

  • Der WCF wurde neue Unterstützung für asynchrones Streaming hinzugefügt.New support for asynchronous streaming has been added to WCF. Um das asynchrone Streaming zu aktivieren, fügen Sie dem Diensthost das DispatcherSynchronizationBehavior-Endpunktverhalten hinzu und legen dessen AsynchronousSendEnabled-Eigenschaft auf true fest.To enable asynchronous streaming, add the DispatcherSynchronizationBehavior endpoint behavior to the service host and set its AsynchronousSendEnabled property to true. Dies begünstigt die Skalierbarkeit, wenn ein Dienst gestreamte Nachrichten an mehrere Clients mit niedriger Lesegeschwindigkeit sendet.This can benefit scalability when a service is sending streamed messages to multiple clients which are reading slowly. Von WCF wird nicht mehr ein Thread pro Client blockiert; der Thread steht für weitere Clients zur Verfügung.WCF does not block one thread per client anymore and will free up the thread to service another client.

  • Einschränkungen im Hinblick auf die Nachrichtenpufferung bei von IIS gehosteten Diensten wurden aufgehoben.Removed limitations around buffering of messages when a service is IIS hosted. Wenn in früheren WCF-Versionen eine Nachricht für einen IIS-gehosteten Dienst einging, der die Nachrichtenübertragung per Stream nutzte, wurde die gesamte Nachricht vor der Übertragung an WCF von ASP.NET gepuffert.In previous versions of WCF when receiving a message for an IIS-hosted service that used streaming message transfer, ASP.NET would buffer the entire message before sending it to WCF. Dieser Vorgang beanspruchte viel Arbeitsspeicher.This would cause large memory consumption. Da diese Pufferung in .NET 4.5 entfernt wurde, können IIS-gehostete WCF-Dienste jetzt mit der Verarbeitung des eingehenden Datenstroms beginnen, bevor die Nachricht vollständig empfangen wurde. Das schafft die Voraussetzungen für echtes Streaming.This buffering has been removed in .NET 4.5 and now IIS-hosted WCF services can start processing the incoming stream before the entire message has been received, thereby enabling true streaming. Dadurch kann WCF sofort auf Nachrichten reagieren, was eine verbesserte Leistung bedeutet.This allows WCF to respond immediately to messages and allows improved performance. Außerdem muss für das ASP.NET-Größenlimit für eingehende Anforderungen maxRequestLength kein Wert mehr angegeben werden.In addition, you no longer have to specify a value for maxRequestLength, the ASP.NET size limit on incoming requests. Wenn diese Eigenschaft festgelegt ist, wird sie ignoriert.If this property is set, it is ignored. Weitere Informationen finden Sie unterFor more information aboutmaxRequestLength finden Sie unter <HttpRuntime >-Konfigurationselements. maxRequestLength see <httpRuntime> configuration element. Müssen Sie dennoch so konfigurieren Sie die MaxAllowedContentLength Weitere Informationen finden Sie unterFor more information, see Anforderungslimits IIS.You will still need to configure the maxAllowedContentLength, Weitere Informationen finden Sie unterFor more information, see IIS Request Limits.

Neue Standardwerte für TransporteNew Transport Default Values

Anhand der folgenden Tabelle erfahren Sie, welche Einstellungen geändert wurden und wo Sie zusätzliche Informationen finden.The following table describes the settings that have changed and where to find additional information.

EigenschaftProperty EinOn Neuer StandardNew Default Weitere InformationenMore Information
channelInitializationTimeoutchannelInitializationTimeout NetTcpBinding 30 Sekunden30 seconds Diese Eigenschaft bestimmt die Zeit, die eine TCP-Verbindung beanspruchen darf, um sich über das .NET Framework-Protokoll zu authentifizieren.This property determines how long a TCP connection can take to authenticate itself using the .Net Framing protocol. Ein Client muss vorab einige Daten senden, bevor der Server über genügend Informationen zum Ausführen der Authentifizierung verfügt.A client needs to send some initial data before the server has enough information to perform authentication. Für dieses Timeout wurde bewusst ein geringerer Wert als für ReceiveTimeout (10 Minuten) festgelegt, damit Serververbindungen von böswilligen, nicht authentifizierten Clients nicht zu lange aufrechterhalten werden können.This timeout is intentionally made smaller than the ReceiveTimeout (10 min) so that malicious unauthenticated clients do not keep the connections tied up to the server for long. Der Standardwert ist 30 Sekunden.The default value is 30 seconds. Weitere Informationen finden Sie unterFor more information about ChannelInitializationTimeout ChannelInitializationTimeout
listenBackloglistenBacklog NetTcpBinding 16 * Anzahl der Prozessoren16 * number of processors Diese Eigenschaft auf Socketebene gibt an, wie viele Anforderungen, deren Annahme aussteht, in die Warteschlange eingereiht werden dürfen.This socket-level property describes the number of "pending accept" requests to be queued. Sobald die listenBacklog-Warteschlange voll ist, werden neue Socketanforderungen abgelehnt.If the listen backlog queue fills up, new socket requests will be rejected. Weitere Informationen finden Sie unterFor more information about ListenBacklog ListenBacklog
maxPendingAcceptsmaxPendingAccepts ConnectionOrientedTransportBindingElementConnectionOrientedTransportBindingElement

SMSvcHost.exeSMSvcHost.exe
2 * Anzahl der Prozessoren für den Transport2 * number of processors for transport

4 * Anzahl der Prozessoren für SMSvcHost.exe4 * number of processors for SMSvcHost.exe
Diese Eigenschaft begrenzt die Anzahl der Kanäle, die auf dem Server auf einen Listener warten können.This property limits the number of channels that the server can have waiting on a listener. Weist MaxPendingAccepts einen zu geringen Wert auf, ist der Zeitraum, in dem alle wartenden Kanäle mit der Verarbeitung von Verbindungen begonnen haben, zu kurz, als dass neue Kanäle das Lauschen gestartet haben könnten.When MaxPendingAccepts is too low, there will be a small interval of time in which all of the waiting channels have started servicing connections, but no new channels have begun listening. Wenn während dieses Zeitraums eine Verbindungsanforderung eingeht, wird sie fehlschlagen, da auf dem Server noch nicht auf neue Verbindungen gelauscht wird.A connection can arrive during this interval and will fail because nothing is waiting for it on the server. Diese Eigenschaft kann konfiguriert werden, indem die MaxPendingConnections-Eigenschaft auf einen höheren Wert festgelegt wird.This property can be configured by setting the MaxPendingConnections property to a larger number. Weitere Informationen finden Sie unterFor more information, seeMaxPendingAccepts und der Net.TCP-Portfreigabedienst konfigurieren MaxPendingAccepts and Configuring the Net.TCP Port Sharing Service
maxPendingConnectionsmaxPendingConnections ConnectionOrientedTransportBindingElementConnectionOrientedTransportBindingElement 12 * Anzahl der Prozessoren12 * number of processors Diese Eigenschaft steuert, wie viele Verbindungen von einem Transport akzeptiert, vom ServiceModel-Verteiler jedoch noch nicht ausgewählt wurden.This property controls how many connections a transport has accepted but have not been picked up by the ServiceModel Dispatcher. Um diesen Wert festzulegen, verwenden Sie MaxConnections für die Bindung oder maxOutboundConnectionsPerEndpoint für das Bindungselement.To set this value, use MaxConnections on the binding or maxOutboundConnectionsPerEndpoint on the binding element. Weitere Informationen finden Sie unterFor more information about MaxPendingConnections MaxPendingConnections
receiveTimeoutreceiveTimeout SMSvcHost.exeSMSvcHost.exe 30 Sekunden30 seconds Diese Eigenschaft gibt das Timeout für das Lesen der TCP-Rahmendaten und das Verteilen der zugrunde liegenden Verbindungen an.This property specifies the timeout for reading the TCP framing data and performing connection dispatching from the underlying connections. Dadurch wird die Dauer beschränkt, die der SMSvcHost.exe-Dienst mit dem Lesen der Präambel einer eingehenden Verbindung beschäftigt ist.This exists to put a cap on the amount of time SMSvcHost.exe service is kept engaged to read the preamble data from an incoming connection. Weitere Informationen finden Sie unterFor more information, seeKonfigurieren die Net.TCP-Portfreigabedienst. Configuring the Net.TCP Port Sharing Service.

Hinweis

Diese neuen Standardwerte werden nur verwendet, wenn Sie den WCF-Dienst auf einem Computer mit .NET Framework 4.5 bereitstellen.These new defaults are used only if you deploy the WCF service on a machine with .NET Framework 4.5. Wenn Sie denselben Dienst auf einem Computer mit .NET Framework 4.0 bereitstellen, werden die Standardwerte von .NET Framework 4.0 verwendet.If you deploy the same service on a machine with .NET Framework 4.0, then the .NET Framework 4.0 defaults are used. In solchen Fällen wird empfohlen, die Einstellungen explizit zu konfigurieren.In such cases it is recommended to configure these settings explicitly.

XmlDictionaryReaderQuotasXmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas enthält konfigurierbare Kontingentwerte für XML-Wörterbuchreader, die den Arbeitsspeicher begrenzen, der beim Erstellen einer Nachricht von einem Encoder verwendet wird.XmlDictionaryReaderQuotas contains configurable quota values for XML dictionary readers which limit the amount of memory utilized by an encoder while creating a message. Während diese Kontingente konfigurierbar sind, wurden die Standardwerte geändert, um die Wahrscheinlichkeit zu vermindern, dass sie von einem Entwickler explizit festgelegt werden müssen.While these quotas are configurable, the default values have changed to lessen the possibility that a developer will need to set them explicitly. Das MaxReceivedMessageSize-Kontingent wurde nicht geändert und kann den Arbeitsspeicherverbrauch weiterhin einschränken. So entfällt die Notwendigkeit, komplexe XmlDictionaryReaderQuotas zu überwachen.MaxReceivedMessageSize quota has not been changed so that it can still limit memory consumption preventing the need for you to deal with the complexity of the XmlDictionaryReaderQuotas. In der folgenden Tabelle sind die Kontingente, die neuen Standardwerte und eine kurze Erläuterung zum Verwendungszweck der einzelnen Kontingente enthalten.The following table shows the quotas, their new default values and a brief explanation of what each quota is used for.

KontingentnameQuota Name StandardwertDefault Value BeschreibungDescription
MaxArrayLength Int32.MaxValueInt32.MaxValue Ruft die maximal zulässige Arraylänge ab und legt sie fest.Gets and sets the maximum allowed array length. Dieses Kontingent schränkt die maximale Größe eines Arrays von Primitiven ein, einschließlich Bytearrays, die vom XML-Reader zurückgegeben werden.This quota limits the maximum size of an array of primitives that the XML reader returns, including byte arrays. Der Arbeitsspeicherverbrauch im XML-Reader selbst wird mit diesem Kontingent nicht eingeschränkt, jedoch in der Komponente, die den Reader verwendet.This quota does not limit memory consumption in the XML reader itself, but in whatever component that is using the reader. Wenn DataContractSerializer z.&#160;B. einen Reader verwendet, der mit MaxArrayLengthgesichert ist, werden keine Bytearrays deserialisiert, deren Größe dieses Kontingent überschreitet.For example, when the DataContractSerializer uses a reader secured with MaxArrayLength, it does not deserialize byte arrays larger than this quota.
MaxBytesPerRead Int32.MaxValueInt32.MaxValue Ruft die bei jedem Lesevorgang zurückgegebenen maximal zulässigen Bytes ab und legt sie fest.Gets and sets the maximum allowed bytes returned for each read. Dieses Kontingent beschränkt die Anzahl der Bytes, die in einem einzelnen Vorgang beim Lesen des Starttags des Elements und dessen Attributen gelesen werden.This quota limits the number of bytes that are read in a single Read operation when reading the element start tag and its attributes. (In Fällen ohne Streaming wird der Elementname selbst nicht in die Berechnung des Kontingents einbezogen.)(In non-streamed cases, the element name itself is not counted against the quota). Bei zu vielen XML-Attributen kann die Verarbeitungszeit übermäßig lange dauern, da die Attributnamen auf Eindeutigkeit überprüft werden müssen.Having too many XML attributes may use up disproportionate processing time because attribute names have to be checked for uniqueness. MaxBytesPerRead mindert dieses Risiko.MaxBytesPerRead mitigates this threat.
MaxDepth Tiefe von 128 Knoten128 nodes deep Diese Kontingent schränkt die maximale Schachtelungstiefe von XML-Elementen ein.This quota limits the maximum nesting depth of XML elements. MaxDepth interagiert mit MaxBytesPerRead: Der Reader behält stets Daten für das aktuelle Element und alle seiner übergeordneten Elemente im Arbeitsspeicher, weshalb der maximale Arbeitsspeicherverbrauch proportional zum Produkt aus diesen beiden Einstellungen ist.MaxDepth interacts with MaxBytesPerRead: the reader always keeps data in memory for the current element and all of its ancestors, so the maximum memory consumption of the reader is proportional to the product of these two settings. Wenn Sie ein tief geschachteltes Objektdiagramm deserialisieren, ist das Deserialisierungsprogramm gezwungen, auf den gesamten Stapel zuzugreifen und eine nicht behebbare StackOverflowExceptionauszulösen.When deserializing a deeply-nested object graph, the deserializer is forced to access the entire stack and throw an unrecoverable StackOverflowException. Ein direkter Zusammenhang besteht zwischen XML-Schachtelung und der objektschachtelung sowohl die DataContractSerializer und System.Runtime.Serialization.XmlSerializer.A direct correlation exists between XML nesting and object nesting for both the DataContractSerializer and the System.Runtime.Serialization.XmlSerializer. MaxDepth wird verwendet, um dieses Risiko zu mindern.MaxDepth is used to mitigate this threat.
MaxNameTableCharCount Int32.MaxValueInt32.MaxValue Dieses Kontingent beschränkt die maximale Anzahl von Zeichen, die in einer Nametable zulässig sind.This quota limits the maximum number of characters allowed in a nametable. Die Nametable enthält bestimmte Zeichenfolgen (z. B. Namespaces and Präfixe), die beim Verarbeiten von XML-Dokumenten auftreten.The nametable contains certain strings (such as namespaces and prefixes) that are encountered when processing an XML document. Da diese Zeichenfolgen im Arbeitsspeicher gepuffert werden, kann mit diesem Kontingent eine übermäßige Pufferung verhindert werden, wenn die Zeichenfolgen erwartungsgemäß gestreamt werden sollen.As these strings are buffered in memory, this quota is used to prevent excessive buffering when streaming is expected.
MaxStringContentLength Int32.MaxValueInt32.MaxValue Dieses Kontingent schränkt die maximale Größe der Zeichenfolgen ein, die vom XML-Reader zurückgegeben werden.This quota limits the maximum string size that the XML reader returns. Der Arbeitsspeicherverbrauch im XML-Reader selbst wird mit diesem Kontingent nicht eingeschränkt, jedoch in der Komponente, die den Reader verwendet.This quota does not limit memory consumption in the XML reader itself, but in the component that is using the reader. Wenn DataContractSerializer z.&#160;B. einen Reader verwendet, der mit MaxStringContentLengthgesichert ist, werden keine Zeichenfolgen deserialisiert, deren Größe dieses Kontingent überschreitet.For example, when the DataContractSerializer uses a reader secured with MaxStringContentLength, it does not deserialize strings larger than this quota.

Wichtig

Finden Sie unter "Sicheres Verwenden von XML" unter Sicherheitsüberlegungen zu Daten für Weitere Informationen zum Sichern Ihrer Daten.Refer to "Using XML Safely" under Security Considerations for Data for more information about securing your data.

Hinweis

Diese neuen Standardwerte werden nur verwendet, wenn Sie den WCF-Dienst auf einem Computer mit .NET Framework 4.5 bereitstellen.These new defaults are used only if you deploy the WCF service on a machine with .NET Framework 4.5. Wenn Sie denselben Dienst auf einem Computer mit .NET Framework 4.0 bereitstellen, werden die Standardwerte von .NET Framework 4.0 verwendet.If you deploy the same service on a machine with .NET Framework 4.0, then the .NET Framework 4.0 defaults are used. In solchen Fällen wird empfohlen, die Einstellungen explizit zu konfigurieren.In such cases it is recommended to configure these settings explicitly.

WCF-KonfigurationsvalidierungWCF Configuration Validation

Im Rahmen des Buildvorgangs innerhalb von Visual Studio werden WCF-Konfigurationsdateien jetzt überprüft.As part of the build process within Visual Studio, WCF configuration files are now validated. Eine Liste mit Validierungsfehlern oder Warnungen wird in Visual Studio angezeigt, wenn die Validierung fehlschlägt.A list of validation errors or warnings are displayed in Visual Studio if the validation fails.

XML-Editor-QuickInfosXML Editor Tooltips

Um neuen und bereits erfahrenen Entwicklern von WCF-Diensten die Konfiguration zu erleichtern, zeigt der XML-Editor in Visual Studio nun QuickInfos für jedes Konfigurationselement, das Teil der Dienstkonfigurationsdatei ist, und dessen Eigenschaften an.In order to help new and existing WCF service developers to configure their services, the Visual Studio XML editor now provides tooltips for every configuration element and its properties that is part of the service configuration file.

BasicHttpBinding-VerbesserungenBasicHttpBinding Improvements

  1. Ermöglicht es einem einzelnen WCF-Endpunkt, auf verschiedene Authentifizierungsmodi zu reagieren.Enables a single WCF endpoint to respond to different authentication modes.

  2. Ermöglicht die Steuerung der Sicherheitseinstellungen eines WCF-Diensts durch IIS.Enables a WCF service’s security settings to be controlled by IIS