# Windows Communication Foundation

Die Windows Communication Foundation (WCF, früherer Codename Indigo) ist eine dienstorientierte Kommunikationsplattform für verteilte Anwendungen in Microsoft Windows. Sie führt viele Netzwerkfunktionen zusammen und stellt sie den Programmierern solcher Anwendungen standardisiert zur Verfügung.
Durch die WCF werden die Kommunikationstechnologien DCOM, Enterprise Services, MSMQ, WSE und Web-Services unter einer einheitlichen Programmierschnittstelle zusammengefasst. Mit der WCF wird das .NET Remoting abgelöst. WCF kann für die Entwicklung Service-orientierter Architekturen verwendet werden. Die Windows Communication Foundation ermöglicht auch Interoperabilität zu Java Web Services, welche mittels Web Services Interoperability Technology umgesetzt wurden.
Die Windows Communication Foundation ist seit .Net-Framework 3.0 ein fester Bestandteil des .NET Frameworks. Die Versionsnummern von WCF orientieren sich hierbei an der Version des .NET Frameworks.
Für das .NET Core Framework (auf dem auch die neueren Version von .NET ab Version 5 basieren) stand WCF in der bisherigen Form zunächst nicht zur Verfügung. Als Alternative empfahl Microsoft die Verwendung von gRPC, welches seit .NET Core 3.0 unterstützt wird. Zusätzlich soll jedoch die Migration zu .NET Core durch ein Communityprojekt namens CoreWCF erleichtert werden, das im April 2022 mit einer ersten Version freigegeben wurde. Es wurde aber zunächst nur eine Teilmenge der Funktionen implementiert.

## Konzept

Die WCF abstrahiert das Konzept des Endpunktes durch eine Trennung in Address, Binding und Contract (ABC-Prinzip).
* Die Address (Adresse) ist ein URI, der den Ort des Dienstes beschreibt und somit seine Erreichbarkeit für die Dienstkonsumenten kennzeichnet.
* Das Binding (Anbindung) beschreibt die Art der Kommunikation, worunter unter anderem die Merkmale der Kodierung und des Protokolls fallen.
* Der Contract (Vertrag) stellt die Dienstdefinition, insbesondere die zur Verfügung gestellten Methoden beinhaltend, dar.

### Address

Der Ort des Dienstes ist, je nach verwendetem Transportschema, der Name des Zielrechners, des Netzwerks oder einer Ressource vom Type Pipe, Communication Port oder Queue.

### Binding

Zum Binding gehören Parameter wie Protokoll (HTTP, TCP, UDP und Windows-eigene Protokolle) und Kodierung (binär, SOAP-Dokument, eigenes Format), sowie Sicherheitsaspekte (Verschlüsselung, Authentifizierung).
Das .NET Framework stellt vorgefertigte Bindungen für häufige Anwendungsfälle zur Verfügung, die noch konfiguriert werden können. Auch besteht die Möglichkeit, eigene Bindings zu entwickeln (beispielsweise für das XML-RPC-Protokoll).

### Contract

Verträge werden zur Entwicklungszeit als Interfaces (Schnittstellen) in einer beliebigen .NET-Sprache verfasst und zur Laufzeit durch die WCF in ein Kommunikationsprotokoll, z. B. SOAP, umgesetzt. Die Verwendung dieses Standards ist maßgeblich für einen plattformunabhängigen Dienstzugriff.

### Behaviors

Das Verhalten einer WCF-Verbindung wird durch Behaviors definiert. Hierbei unterscheidet man abhängig vom Bereich zwischen:
* Service Behavior
* Endpoint Behavior
* Contract Behavior
* Operation Behavior

## Beispiele

Im Folgenden werden Beispiele für die Implementierung eines einfachen WCF-Dienstes gezeigt.

### Implementierung eines Contracts

Der Contract wird sowohl von der Host- als auch von der Clientanwendung verwendet und sollte sich daher in einer eigenen Assembly befinden.

### Deklarative Implementierung einer Hostanwendung

Das Verhalten des Service wird in der Datei App.config bzw. Web.config deklariert. Dies erfolgt üblicherweise mit dem Service Configuration Editor (svcconfigeditor.exe) und kann von erfahrenen Entwicklern und Administratoren auch manuell in einem Texteditor konfiguriert werden.
Durch die Aktivierung des Metadatenaustausches (englisch: Metadata-Exchange, kurz „mex“) mittels eines entsprechenden Bindings (z. B.mexHttpBinding, mexHttpsBinding, mexTcpBinding, mexNamedPipeBinding) können die Proxyklassen und die Anwendungskonfiguration mit dem Service Model Metadata Utility (svcutil.exe) automatisch erstellt werden.
    svcutil /d:"C:\ … \HelloWorld\ConsoleClient" /o:"HelloWorldProxy.cs" /config:"App.config" http://localhost:8000/HelloWorld/mex
Die generierten Proxyklassen und Anwendungskonfiguration können von einem Client sehr einfach konsumiert werden.

### WCF Service Host und WCF Test Client

Eine weitere Möglichkeit ist es, den Service direkt mit Hilfe des WCF Service Host (wcfsvchost.exe) zu hosten.
    wcfsvchost /service:"C:\ … \HelloWorld.Service.dll" /config:"C:\ … \App.config"
Laufende Services, welche den Metadatenaustausch unterstützen, können mit dem WCF Test Client (wcftestclient.exe) analysiert und getestet werden.
    wcftestclient http://localhost:8000/HelloWorld/mex