Windows Communication Foundation (WCF)
Eintrag zuletzt aktualisiert am: 29.04.2022
Windows Communication Foundation (WCF) ist eine Klassenbibliothek (
Managed Library) zur Entwicklung von (servicebasierten) verteilten Anwendungen mit .NET. WCF ist eine flexible Inter-Prozess-Kommunikationsbibliothek für .NET, bei der sich der Entwickler einen Kommunikationskanal aus verschiedenen Protokollen (z.B. HTTP,
TCP,
UDP, Named
Pipes,
MSMQ), Formaten (z.B. SOAP,
POX, Binär,
MTOM,
ATOM,
RSS,
JSON) und Kommunikationsfeatures (z.B.
Authentifizierung, Verschlüsselung und Zuverlässigkeit) individuell zusammenzustellen kann. WCF bietet dabei sowohl WS-*-Standards als auch proprietäre Funktionen von Microsoft. WCF erlaubt die Erstellung von Kommunikationsanwendungen zum Fernaufruf von Code und zur Anwendungskopplung.
Windows Communication Foundation (WCF) ist Teil seit
.NET Framework 3.0 und wurde in jeder neuen Version aktualisiert. Früherer Codename war
Indigo als Teil des
Windows Frameworks (
WinFX). WCF wird installiert durch die Installation des .NET Framework (ab 3.0).
Während Microsoft die Client-Bibliothek für WCF (Windows Communication Foundation Client Libraries) [
https://github.com/dotnet/wcf] beim Umbau von .NET Framework zu
.NET Core übernommen hat, steht die Serverseite von WCF seit 2019 auf der
Liste der Klassen [
https://www.heise.de/developer/meldung/Build-2019-Microsoft-konkretisiert-die-Plaene-fuer-NET-5-0-4416914.html], die Microsoft nicht mehr ins moderne .NET migrieren will. Microsoft verwies die Entwickler darauf, REST-basierte
Web-APIs oder
gRPC-Dienste an Stelle von WCF zu nutzen, was einen erheblichen Migrationsaufwand für bestehende WCF-basierten Services bedeutete [
https://www.heise.de/hintergrund/Umstieg-auf-NET-Core-Teil-4-SOAP-und-REST-Webservices-umstellen-4705706.html?seite=2].
Seit 28. April 2018 gibt es die Version 1.0 des Community-Projekts "CoreWCF", das mit Unterstützung durch Microsoft eine Teilmenge der WCF-Serverseite auf modernem .NET verfügbar macht. Microsoft bietet dafür technischen Support [
https://github.com/CoreWCF/CoreWCF/blob/main/Documentation/Microsoft-Support.md] an, auch wenn das Projekt weiterhin kein offizielles Microsoft-Produkt darstellt und auch nicht als Teil des
.NET SDK ausgeliefert werden wird.
Eigenschaften von WCF
WCF besitzt fünf wesentlichen Eigenschaften:
- Die verschiedenen Aspekte verteilter Kommunikation (Schnittstelle, Implementierung, Kommunikationsprotokoll, Infrastrukturdienste, Hosting) lassen sich gut logisch trennen
- WCF schreibt keine Protokolle und Formate fest vor, sondern erlaubt dem Nutzer einen Kommunikationskanal aus verschiedenen Protokolle und Formate zusammenzustellen.
- Es gibt sowohl Unterstützung für plattformübergreifende Protokolle und Formate (W3C / WS-*) als auch proprietäre Protokolle und Formate der .NET-Welt
- Ohne Neukompilierung eines Dienstes kann die Kommunikationsform geändert werden
- Ohne Neukompilierung können weitere Kommunikationsformen ergänzt werden
Hintergründe
In den ersten drei Versionen des .NET Frameworks (1.0, 1.1 und 2.0) gab es zwei konkurrierende Ansätze für verteilte Systeme mit .NET:
.NET Remoting und die ASP.NET-basierten Webservices, die nach ihrer Dateinamenserweiterung auch einfach kurz
ASMX genannt wurden. Dabei verfolgten
.NET Remoting und
ASMX unterschiedliche Ziele.
.NET Remoting war gedacht für proprietäre Kommunikation zwischen zwei .NET-Anwendungen, während sich .NET mit den ASP.NET-basierten Webservices dem Rest der Welt über die beim
W3C-standardisierte Kommunikation über HTTP/SOAP öffnete. Aufgeweicht wurde diese scharfe Trennung dadurch, dass
.NET Remoting auch einige Spielarten von HTTP/SOAP verstand und Drittanbieter
.NET Remoting um die Kommunikation in Richtung
CORBA und Java über
IIOP und
RMI erweiterten.
Seit
.NET 3.0 gibt es mit der der Windows Communication Foundation (WCF) einen Ansatz, der die Kommunikation zwischen .NET-Anwendungen und die plattformübergreifende Kommunikation unter einem Dach vereint. WCF hat dabei nicht nur dafür gesorgt, dass es nicht mehr zwei grundverschiedene Herangehensweisen für diese beiden Kommunikationsfälle gibt, sondern dass bei einer Anwendung auch ohne Neukompilierung zwischen den beiden Fällen wechseln kann bzw. parallel anbieten kann.
WCF ist ein Superma
rkt mit Angeboten in zahlreichen Kategorien, aus denen sich der Nutzer seinen individuellen Kommunikationskanal zusammenstellen kann. Man wählt ein Übertragungsprotokoll (z.B. HTTP,
TCP, Named
Pipes,
UDP, SMT,
MSMQ) und ein
Serialisierungsformat (z.B. SOAP,
MTOM,
ATOM,
JSON,
RSS oder ein proprietäres Binärformat) sowie optional Standards bezüglich wie
Authentifizierung, Verschlüsselung, Autorisierung, Integrität und Zuverlässigkeit wie WS-Security, WS-Policy, WS-SecurityPolicy, WS-Trust, WS-SecureConversation, WS-Addressing, WS-Federation, WS-ReliableMessaging und WS-AtomicTransactions. Die herausragende Eigenschaft von WCF ist, dass sich der Entwickler zur Entwicklungszeit nicht auf eine Kombination der o.g. Möglichkeiten festlegen muss, sondern dies durch Änderungen der
Konfigurationsdatei zur Betriebszeit und sogar durch Einstellungen des Benutzers zur Laufzeit verändert werden kann. Auch kann ein Endpunkt in WCF gleichzeitig auf verschiedene Weisen (z.B.
TCP/bin und HTTP/SOAP) mit Clients kommunizieren.
Offiziell bezeichnet Microsoft als die Vereinheitlichung folgende Konzepte:
Zwar sind aus allen diesen Technologien Teile in WCF enthalten, doch in ein ganzer Zweig der verteilten Kommunikation in WCF nicht mehr berücksichtigt: Das Konzept verteilter
Objektsystem mit echten Proxies und echten
Objektkopien. Das serviceorientierte Konzept sieht nur noch vor, dass Client (vorzugsweise zustandslose) Dienste aufrufen, die Daten austauschen. Auf dem Client sind die Daten nur noch reine
Datenstrukturen und besitzen keine domänenspezifischen
Methoden mehr.
Entwicklern vin Clients und Servern
WCF stellt für die Kommunikationen zwischen
Prozessen oder Systemen zahlreiche frei kombinierbare Funktionen wie
Authentifizierung, Verschlüsselung, Autorisierung, Integrität, Zuverlässigkeit,
Transaktionen und Nachrichtenwarteschlangen bereit. Wie bei
.NET Remoting sind das Übertragungsprotokoll und das
Serialisierungsformat wählbar. Microsoft wird zunächst zur Übertragung per HTTP, HTTPS,
TCP,
MSMQ sowie Named
Pipes unterstützen. Bei der
Serialisierung besteht die Wahl zwischen dem textbasierten SOAP, dem
Message Transmission Optimization Mechanism (
MTOM) und einem binärcodierten SOAP, das Microsoft proprietär entwickelt hat. Ab
.NET 3.5 werden auch die Formate
JavaScript Object Notation (
JSON),
Really Simple Syndication (
RSS) und das Atom Syndication Format.
WCF unterstützt viele bestehende Webservice-Standards wie WS-Security, WS-Trust, WS-AtomicTransaction, WS-Coordination, WS-SecureConversation und WS-ReliableMessaging. Drittanbieter können weitere Protokolle und Formate ergänzen.
Ein WCF-Dienst besitzt einen oder mehrere Endpunkte mit verschiedenen Eigenschaften:
- Die Adresse besteht aus einem URL mit Protokollangabe, Pfad und Port.
- Der Vertrag (Contract) definiert die eigentlichen Operationen, die der Dienst anbietet.
- In der Bindung (Binding) sind die bei der Kommunikation zu verwendenden Protokolle und Formate festgelegt.
Zum Hosting von WCF-Diensten stehen dem Entwickler ebenfalls mehrere Optionen zur Verfügung, die von einer einfachen Konsolenanwendung, über einen Windows-Dienst und den
Internet Information Server (
IIS) bis zu dem in Windows integrierten Application Server COM+ reicht. In Vista und
Windows Server 2008 stellt Microsoft mit
Windows Activation Service (
WAS) (früherer Name »
Webhost«) einen universellen Host für WCF-Dienste bereit. Ein echter .NET-fähiger Application Server fehlt aber weiterhin. Diesen wird Microsoft in den nächsten Jahren erst im Rahmen des Projekt "Oslo" [RW01] erstellen.
Eine herausragende Eigenschaft von WCF ist, dass einen Dienst mehrere verschiedene Endpunkte mit unterschiedlichen Formaten und Protokollen besitzen kann. Dies bedeutet, dass man einen WCF-Dienst schreiben kann, der von .NET-Clients über proprietäre Protokolle und gleichzeitig von anderen Clients (z.B. Java, C++,
PHP) über
W3C-Standards angesprochen werden kann.
[RW01] Robert Wahbe: Crossing Boundaries: The Vision for Oslo
http://www.microsoft.com/soa/products/oslo.aspx
Implementierung
Die WCF-Erweiterungen für
Visual Studio bietem eine Projekt- und eine Elementvorlage, die den Quellcode für einen "Hallo Welt"-Dienst und einen passenden WCF-Host enthalten. Durch einen neuen Kontextmenü-Eintrag "Add Service Reference" (nicht zu verwechseln mit "Add Web Reference") kann man den passenden Client generieren lassen. Alternativ steht das Kommandozeilenwerkzeug svcutil.exe zur Verfügung.
Using System;
using System.ServiceModel;
[Service
Contract()]
public interface IHalloDienst
{
[Operation
Contract]
string SageHallo(string name);
}
public class HalloDienst : IHalloDienst
{
public string SageHallo(string name)
{
return "Hallo " + name + "!";
}
}
Listing 1: Das Grundbeispiel für einen verteilten WCF-Dienst
<configuration xmlns="
http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.serviceModel>
<services>
<!-- Before deployment, you should remove the returnFaults behavior configuration to avoid disclosing information in exception messages -->
<service name="HalloDienst" behaviorConfiguration="returnFaults">
<endpoint contract="IHalloDienst " binding="wsHttpBinding"/>
</service>
</services>
<behaviors>
<behavior name="returnFaults" returnUnknown
ExceptionsAsFaults="true" />
</behaviors>
</system.serviceModel>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
Listing 2: Konfiguration für den Dienst aus Listing 1
Interoperabilität
WCF ist kompatibel zu mit ASP.NET erstellten
XML-Webservices (
ASMX), sofern nur die Protokolle von
WS-I BP1 verwendet werden. WCF ist nicht kompatibel zu
.NET Remoting. Ein .NET Remo-ing-Client kann nicht mit einem WCF-Dienst reden.
Kritik an WCF
Auf den ersten Blick beeindruckt die Vielfalt der in WCF verfügbaren Optionen. Ein Entwickler verteilter Anwendung muss sich jedoch bewusst sein, dass WCF dem Paradigma "Serviceorientierung" folgt. Die in
.NET Remoting verfügbare objektorientierte Anwendungsverteilung, z.B. das Übergeben einer
Objektreferenz, entfällt. Außerdem wird das in
.NET Remoting verwendete Binärformat nicht mehr unterstützt, sodass ein
.NET Remoting-Client gar nicht mit einem WCF-Dienst reden kann. Da das Binärformat nicht dokumentiert ist, hilft es wenig, dass man WCF erweitern kann für die Kommunikation mit anderen Fernaufrufprotokollen wie Java
RMI und
CORBA. Entwickler, die auf
.NET Remoting gesetzt haben, müssen migrieren oder mit einer alten, zukünftig von Microsoft nicht mehr weiterentwickelten Technologie leben. COM+-Anwendungen hingegen kann man als WCF-Dienst veröffentlichen und mit COM-Clients kann man WCF Services aufrufen.
Zudem hat die Austauschbarkeit von Protokollen innerhalb von WCF auch Grenzen, denn einige Protokolle ziehen automatisch andere Eigenschaften des Kommunikationskanal nach sich, sodass es bei Änderung des Protokolls zu einer Verhaltensänderung kommen kann.