Neues in Windows Communication Foundation 4.5

In diesem Thema werden die neuen Features der Version 4.5 von Windows Communication Foundation (WCF) beschrieben.

gRPC als Alternative zu WCF

gRPC ist ein modernes RPC-Framework und eine beliebte Alternative zu WCF. gRPC basiert auf HTTP/2, das eine Reihe von Vorteilen gegenüber WCF bietet, einschließlich:

  • Leistung: gRPC ist deutlich effizienter als WCF, insbesondere bei Verbindungen mit langer Ausführungszeit.
  • Skalierbarkeit: gRPC ist darauf ausgelegt, auf eine große Anzahl von Clients und Servern skaliert zu werden.
  • Sicherheit: gRPC unterstützt eine Vielzahl von Sicherheitsmechanismen, einschließlich TLS und Authentifizierung.
  • Plattformübergreifend: gRPC ist plattformneutral und kann mit einer Vielzahl von Programmiersprachen verwendet werden.

Weitere Informationen zur Entwicklung oder zum Migrieren von WCF-Apps zu gRPC finden Sie unter:

WCF-Vereinfachungsfunktionen

Es wurde viel unternommen, um die Entwicklung und Verwaltung von WCF 4.5-Anwendungen zu vereinfachen. Weitere Informationen finden Sie unter WCF-Vereinfachungsfunktionen.

Aufgabenbasierte asynchrone Unterstützung

Durch Dienstverweis hinzufügen werden standardmäßig asynchrone Methoden für Dienstvorgänge generiert, die Tasks zurückgeben. Dies erfolgt sowohl für synchrone als auch für asynchrone Methoden. Auf diese Weise können die Dienstvorgänge mithilfe des neuen aufgabenbasierten asynchronen Programmiermodells asynchron aufgerufen werden. Wenn Sie die generierte Proxymethode aufrufen, erstellt WCF ein Taskobjekt, das den asynchronen Vorgang darstellt, und gibt diesen Task an Sie zurück. Die Aufgabe wird zusammen mit dem Vorgang abgeschlossen. Daher können Sie einen asynchronen Vorgang als aufgabenbasierten asynchronen Vorgang implementieren. Weitere Informationen zu synchronen und asynchronen Vorgängen finden Sie hier.

Vereinfachte generierte Konfigurationsdateien

Wenn Sie einen Dienstverweis in Visual Studio hinzufügen oder das SvcUtil.exe-Tool verwenden, wird eine Clientkonfigurationsdatei generiert. In früheren Versionen von WCF enthielten diese Konfigurationsdateien den Wert jeder Bindungseigenschaft, auch wenn deren Wert dem Standardwert entsprach. In WCF 4.5 enthalten die generierten Konfigurationsdateien nur die Bindungseigenschaften, die auf einen nicht standardmäßigen Wert festgelegt sind.

Weitere Informationen finden Sie unter WCF-Vereinfachungsfunktionen.

Vertrag zuerst-Entwicklung

WCF unterstützt jetzt die Vertrag zuerst-Entwicklung. Das Tool „svcutl.exe“ verfügt über einen Schalter vom Typ „/serviceContract“, der das Generieren von Dienst- und Datenverträgen auf der Grundlage eines WSDL-Dokuments ermöglicht.

Hinzufügen eines Dienstverweises aus einem Projekt für die portable Teilmenge

Portable Subset-Projekte ermöglichen es Programmierer*innen von .NET-Assemblys, eine einzelne Quellstruktur zu verwalten und ein System mit Unterstützung mehrerer .NET-Plattformen (Desktop, Silverlight, Windows Phone und Xbox) aufzubauen. Portable Subset-Projekte verweisen nur auf portierbare .NET-Bibliotheken, bei denen es sich um .NET-Assemblys handelt, die von einer beliebigen .NET-Plattform verwendet werden können. Die Entwicklererfahrung ist identisch mit dem Hinzufügen eines Dienstverweises innerhalb einer beliebigen anderen WCF-Clientanwendung. Weitere Informationen finden Sie unter Hinzufügen eines Dienstverweises in einem Portable Subset-Projekt.

Geänderter Standard für den ASP.NET-Kompatibilitätsmodus

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. Um diesen Modus zu verwenden, müssen Sie das Attribut aspNetCompatibilityEnabled im Abschnitt <serviceHostingEnvironment> von „web.config“ auf „true“ festlegen. Darüber hinaus muss für jeden Dienst in dieser App-Domäne die RequirementsMode-Eigenschaft in AspNetCompatibilityRequirementsAttribute auf Allowed oder Required festgelegt sein. Standardmäßig ist AspNetCompatibilityRequirementsAttribute jetzt auf Allowed festgelegt. Weitere Informationen finden Sie unter WCF-Dienste und ASP.NET.

Neue Standardwerte für Transporte

Um die Konfiguration zu vereinfachen, wurden einige Standardwerte der Transporteigenschaft geändert. Weitere Informationen finden Sie unter WCF-Vereinfachungsfunktionen.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas enthält konfigurierbare Kontingentwerte für XML-Wörterbuchreader, die den Arbeitsspeicher begrenzen, der beim Erstellen einer Nachricht von einem Encoder verwendet wird. Diese Kontingente sind konfigurierbar, allerdings wurden die Standardwerte geändert, um die Wahrscheinlichkeit zu verringern, dass sie von einem Entwickler explizit festgelegt werden müssen. Weitere Informationen finden Sie unter WCF-Vereinfachungsfunktionen.

WCF-Konfigurationsvalidierung

Im Rahmen des Buildvorgangs innerhalb von Visual Studio werden WCF-Konfigurationsdateien jetzt für die Attribute überprüft, die innerhalb des Projekts definiert sind. Eine Liste mit Validierungsfehlern oder Warnungen wird in Visual Studio angezeigt, wenn die Validierung fehlschlägt.

XML-Editor-QuickInfos

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.

Verbesserungen beim Streaming

Es wurde Unterstützung für echtes asynchrones Streaming hinzugefügt, bei dem die Senderseite keine Threads blockiert, wenn die Empfängerseite keine Nachrichten liest bzw. Nachrichten langsam liest. Dies erhöht die Skalierbarkeit. Die Einschränkung des Nachrichtenpuffers, die gilt, wenn ein Client eine gestreamte Nachricht an einen von IIS gehosteten WCF-Dienst sendet, wurde aufgehoben. Weitere Informationen finden Sie unter WCF-Vereinfachungsfunktionen.

Einfacheres Verfügbarmachen eines Endpunkts über HTTPS mit IIS

Eine HTTPS-Protokollzuordnung wurde hinzugefügt, um das Verfügbarmachen eines Endpunkts über HTTPS zu vereinfachen. Um einen HTTPS-Endpunkt zu aktivieren, stellen Sie sicher, dass für die Website eine HTTPS-Bindung und ein SSL-Zertifikat konfiguriert wurden. Aktivieren Sie dann einfach HTTPS für das virtuelle Verzeichnis, von dem der Dienst gehostet wird. Wenn Metadaten für den Dienst aktiviert sind, werden sie ebenfalls über HTTPS verfügbar gemacht.

Generieren eines einzelnen WSDL-Dokuments

WSDL-Verarbeitungsstapel einiger Drittanbieter sind nicht in der Lage, WSDL-Dokumente zu verarbeiten, die über Abhängigkeiten mit anderen Dokumenten in Form von "xsd: import" verfügen. In WCF können Sie jetzt angeben, dass alle WSDL-Informationen in einem einzelnen Dokument zurückgegeben werden. Um ein einzelnes WSDL-Dokument anzufordern, fügen Sie „? singleWSDL“ an den URI an, wenn Sie Metadaten vom Dienst anfordern.

WebSocket-Unterstützung

WebSockets ist eine Technologie, die die echte bidirektionale Kommunikation über die Ports 80 und 443 ermöglicht, wobei die Leistungsmerkmale denen von TCP ähneln. Um die Kommunikation über einen WebSocket-Transport zu unterstützen, wurden zwei neue Bindungen hinzugefügt. NetHttpBinding und NetHttpsBinding. Weitere Informationen finden Sie unter Vom System bereitgestellte Bindungen.

Neue Standardwerte für Transporte

Anhand der folgenden Tabelle erfahren Sie, welche Einstellungen geändert wurden und wo Sie zusätzliche Informationen finden.

Eigenschaft Ein Neuer Standard Weitere Informationen finden Sie unter
channelInitializationTimeout NetTcpBinding 30 Sekunden ChannelInitializationTimeout
listenBacklog NetTcpBinding 12 * Anzahl der Prozessoren ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * Anzahl der Prozessoren für den Transport

4 * Anzahl der Prozessoren für "SMSvcHost.exe"
MaxPendingAcceptsKonfigurieren des Net.TCP-Portfreigabediensts
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * Anzahl der Prozessoren MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 Sekunden Konfigurieren des Net.TCP-Portfreigabediensts

Konfigurieren von WCF-Diensten in Code

Windows Communication Foundation (WCF) ermöglicht Entwicklerinnen und Entwicklern das Konfigurieren von Diensten mithilfe von Konfigurationsdateien oder Code. Konfigurationsdateien sind nützlich, wenn ein Dienst konfiguriert werden muss, nachdem er bereitgestellt wurde. Bei der Verwendung von Konfigurationsdateien muss ein IT-Experte nur die Konfigurationsdatei aktualisieren, es ist keine Neukompilierung erforderlich. Konfigurationsdateien können jedoch komplex und schwierig zu pflegen sein. Das Debuggen von Konfigurationsdateien wird nicht unterstützt. Auf Konfigurationselemente wird über den Namen verwiesen, was die Erstellung von Konfigurationsdateien fehleranfällig und schwierig macht. WCF ermöglicht auch das Konfigurieren von Diensten im Code. In früheren Versionen von WCF (4.0 und früher) war das Konfigurieren von Diensten im Code in selbstgehosteten Szenarien einfach, weil die ServiceHost-Klasse die Möglichkeit bot, Endpunkte und Verhaltensweisen vor dem Aufrufen von „ServiceHost.Open“ zu konfigurieren. In webgehosteten Szenarien haben Sie jedoch keinen Zugriff auf die ServiceHost-Klasse. Um einen webgehosteten Dienst zu konfigurieren, mussten Sie eine System.ServiceModel.ServiceHostFactory erstellen, durch die ein ServiceHostFactory erstellt und alle erforderlichen Konfigurationsschritte ausgeführt wurden. Ab .NET Framework 4.5 bietet WCF eine einfachere Möglichkeit, selbstgehostete und webgehostete Dienste im Code zu konfigurieren. Weitere Informationen finden Sie unter Konfigurieren von WCF-Diensten in Code.

ChannelFactory-Caching

WCF-Clientanwendungen verwenden die ChannelFactory<TChannel>-Klasse, um einen Kommunikationskanal mit einem WCF-Dienst zu erstellen. Die Erstellung von ChannelFactory<TChannel>-Instanzen verursacht einigen Mehraufwand, da sie die folgenden Vorgänge umfasst:

  1. Erstellen der ContractDescription-Struktur

  2. Reflektieren aller erforderlichen CLR-Typen

  3. Erstellen des Kanalstapels

  4. Freigeben von Ressourcen

Um den Mehraufwand zu minimieren, kann WCF Kanalfactorys zwischenspeichern, wenn Sie einen WCF-Clientproxy verwenden. Weitere Informationen finden Sie unter Kanalfactory und Zwischenspeichern.

Komprimierung und binärer Encoder

Ab WCF 4.5 bietet der binäre WCF-Encoder Komprimierungsunterstützung. Der Komprimierungstyp wird mit der CompressionFormat-Eigenschaft konfiguriert. Sowohl der Client als auch der Dienst müssen die CompressionFormat-Eigenschaft konfigurieren. Die Komprimierung unterstützt die HTTP-, HTTPS- und TCP-Protokolle. Wenn ein Client angibt, dass die Komprimierung verwendet werden soll, der Dienst aber keine Komprimierung unterstützt, wird eine Ausnahme über einen Protokollkonflikt ausgelöst. Weitere Informationen zu Encodern finden Sie unter Auswählen eines Nachrichtenencoders.

UDP

Es wurde Unterstützung für einen UDP-Transport hinzugefügt, der es Entwickler*innen ermöglicht, Dienste mit Fire-and-Forget-Messaging (Auslösen und Vergessen) zu schreiben. Ein Client sendet eine Nachricht an einen Dienst und erwartet von diesem keine Antwort.

Unterstützung mehrerer Authentifizierungen

Es werden jetzt mehrere Authentifizierungsmodi, so wie von IIS unterstützt, für einen einzelnen WCF-Endpunkt unterstützt, wenn der HTTP-Transport und die Transportsicherheit verwendet werden. IIS ermöglicht es Ihnen, mehrere Authentifizierungsmodi für ein virtuelles Verzeichnis zu aktivieren. Durch diese Funktion kann ein einzelner WCF-Endpunkt mehrere Authentifizierungsmodi unterstützen, die für das virtuelle Verzeichnis aktiviert sind, in dem der WCF-Dienst gehostet wird.

IDN-Unterstützung

Unterstützung für WCF-Dienste mit IDNs (Internationalized Domain Names) wurde hinzugefügt. Weitere Informationen finden Sie unter WCF und internationale Domänennamen.

HttpClient

Eine neue Klasse mit dem Namen HttpClient wurde hinzugefügt, um das Arbeiten mit HTTP-Anforderungen erheblich zu vereinfachen. Weitere Informationen finden Sie unter HttpClient sowie unter Richtlinien für die Verwendung von HttpClient.

Konfiguration mit IntelliSense

Attributwerte in den Konfigurationsdateien für benutzerdefinierte Attribute, die im Projekt definiert sind, unterstützen jetzt IntelliSense, um das schnelle und präzise Arbeiten mit Konfigurationen zu erleichtern.

QuickInfos zur Konfiguration

WCF-Elemente und -Attribute verfügen jetzt über QuickInfos im XML-Editor, um den Verwendungszweck des Elements oder Attributs einfacher und genauer zu identifizieren.

Einfügen von Daten als Klassen

In einem WCF-Projekt können die in XML definierten Datentypen (die in einem Dienst verfügbar gemacht sind) direkt in eine Codepage eingefügt werden. Der XML-Typ wird als CLR-Typ eingefügt. Ausführlichere Informationen finden Sie unter Generieren von Datentypklassen aus XML.

WebServiceHost und Standardendpunkte

In Visual Studio 2010 wurde von WebServiceHost automatisch ein Standardendpunkt erstellt, unabhängig davon, ob ein Endpunkt explizit angegeben wurde oder nicht. Ab Visual Studio 2012 erstellt WebServiceHost nur einen Standardendpunkt, wenn nicht explizit Endpunkte hinzugefügt werden. Wenn der Client den Standardendpunkt erwartet, können Sie einen Endpunkt explizit hinzufügen und den Client darauf verweisen. Alternativ können Sie WCF anweisen, zum früheren Verhalten zurückzukehren, indem Sie der Anwendungskonfigurationsdatei folgende Einstellung hinzufügen:

<appSettings>
    <add key="wcf:webservicehost:enableautomaticendpointscompatability" value="true"/>
  </appSettings>

IHttpCookieContainerManager

Diese von IChannelFactory<TChannel> verfügbar gemachte Schnittstelle vereinfacht die Verwendung von Cookies auf der Clientseite. Wenn AllowCookies für die Bindung auf True festgelegt ist, können Sie mit folgendem Code auf Cookies zugreifen:

IHttpCookieContainerManager cookieManager = factory.GetProperty<IHttpCookieContainerManager>();
System.Net.CookieContainer container = cookieManager.CookieContainer;

Anschließend können die Cookies unter Verwendung von CookieContainer abgerufen oder festgelegt werden. Wenn AllowCookies auf False festgelegt ist, können Sie die Cookies mit manuell abrufen und in anderen Anforderungen unter Verwendung eines anderen oder Meldungsinspektors senden. Die IHttpCookieContainerManager-Schnittstelle ermöglicht es Ihnen, einen Benutzer bei einem Dienst zu authentifizieren und das vom Dienst zurückgegebene Authentifizierungscookie zum Authentifizieren bei anderen Diensten zu verwenden.