Windows Communication Foundation

Windows Communication Foundation

Windows Communication Foundation (WCF) ist ein Framework zum Erstellen dienstorientierter Anwendungen. Mit WCF können Sie Daten als asynchrone Nachrichten von einem Dienstendpunkt an einen anderen senden. Ein Dienstendpunkt kann Teil eines ständig verfügbaren Diensts sein, der von IIS gehostet wird, oder es kann sich um einen Dienst handeln, der in einer Anwendung gehostet wird. Die Nachrichten können so einfach wie ein einzelnes Zeichen oder Wort sein, das als XML gesendet wird, oder so komplex wie ein Strom binärer Daten.

# Erste-Schritte-Beispiel

Der Dienst beschreibt die von ihm ausgeführten Vorgänge in einem Dienstvertrag, den er öffentlich als Metadaten bereitstellt.

// Define a service contract.  
[ServiceContract(Namespace="http://StackOverflow.ServiceModel.Samples")]  
public interface ICalculator  
{  
    [OperationContract]  
    double Add(double n1, double n2);
}

Die Dienstimplementierung berechnet das entsprechende Ergebnis und gibt es zurück, wie im folgenden Beispielcode gezeigt.

// Service class that implements the service contract.  
public class CalculatorService : ICalculator  
{  
    public double Add(double n1, double n2)  
    {  
        return n1 + n2;  
    }
}

Der Dienst macht einen Endpunkt für die Kommunikation mit dem Dienst verfügbar, der mithilfe einer Konfigurationsdatei (Web.config) definiert wird, wie in der folgenden Beispielkonfiguration gezeigt.

<services>  
    <service   
        name="StackOverflow.ServiceModel.Samples.CalculatorService"  
        behaviorConfiguration="CalculatorServiceBehavior">  
        <!-- ICalculator is exposed at the base address provided by  
         host: http://localhost/servicemodelsamples/service.svc.  -->  
       <endpoint address=""  
              binding="wsHttpBinding"  
              contract="StackOverflow.ServiceModel.Samples.ICalculator" />  
       ...  
    </service>  
</services>

Das Framework macht standardmäßig keine Metadaten verfügbar. Als solches aktiviert der Dienst das ServiceMetadataBehavior und macht einen Endpunkt für den Metadatenaustausch (MEX) unter http://localhost/servicemodelsamples/service.svc/mex verfügbar. Die folgende Konfiguration demonstriert dies.

<system.serviceModel>  
  <services>  
    <service   
        name="StackOverflow.ServiceModel.Samples.CalculatorService"  
        behaviorConfiguration="CalculatorServiceBehavior">  
      ...  
      <!-- the mex endpoint is explosed at  
       http://localhost/servicemodelsamples/service.svc/mex -->  
      <endpoint address="mex"  
                binding="mexHttpBinding"  
                contract="IMetadataExchange" />  
    </service>  
  </services>  

  <!--For debugging purposes set the includeExceptionDetailInFaults  
   attribute to true-->  
  <behaviors>  
    <serviceBehaviors>  
      <behavior name="CalculatorServiceBehavior">  
        <serviceMetadata httpGetEnabled="True"/>  
        <serviceDebug includeExceptionDetailInFaults="False" />  
      </behavior>  
    </serviceBehaviors>  
  </behaviors>  
</system.serviceModel>  

Der Client kommuniziert mit einem bestimmten Vertragstyp, indem er eine Clientklasse verwendet, die vom ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wird.

Führen Sie den folgenden Befehl an der SDK-Eingabeaufforderung im Clientverzeichnis aus, um den eingegebenen Proxy zu generieren:

svcutil.exe /n:"http://StackOverflow.ServiceModel.Samples,StackOverflow.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs  

Wie der Dienst verwendet der Client eine Konfigurationsdatei (App.config), um den Endpunkt anzugeben, mit dem er kommunizieren möchte. Die Clientendpunktkonfiguration besteht aus einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag, wie im folgenden Beispiel gezeigt.

<client>  
     <endpoint  
         address="http://localhost/servicemodelsamples/service.svc"   
         binding="wsHttpBinding"   
         contract="StackOverflow.ServiceModel.Samples.ICalculator" />  
</client>  

Die Clientimplementierung instanziiert den Client und verwendet die typisierte Schnittstelle, um mit der Kommunikation mit dem Dienst zu beginnen, wie im folgenden Beispielcode gezeigt.

// Create a client.  
CalculatorClient client = new CalculatorClient();  

// Call the Add service operation.  
double value1 = 100.00D;  
double value2 = 15.99D;  
double result = client.Add(value1, value2);  
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); 

//Closing the client releases all communication resources.  
client.Close();  


No