Freigeben über


Beispiel für erste Schritte

Das GettingStarted-Beispiel veranschaulicht, wie sie einen typischen Dienst und einen typischen Client mithilfe von Windows Communication Foundation (WCF) implementieren. Dieses Beispiel ist die Basis für alle anderen Grundlegenden Technologiebeispiele.

Hinweis

Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Der Dienst beschreibt die Vorgänge, die er in einem Dienstvertrag ausführt, der öffentlich als Metadaten verfügbar gemacht wird. Der Dienst enthält auch den Code zum Implementieren der Vorgänge.

Der Client enthält eine Definition des Dienstvertrags und eine Proxyklasse für den Zugriff auf den Dienst. Der Proxycode wird aus den Dienstmetadaten mithilfe des ServiceModel Metadata Utility Tools (Svcutil.exe) generiert.

Unter Windows Vista wird der Dienst im Windows-Aktivierungsdienst (WAS) gehostet. Unter Windows XP und Windows Server 2003 wird sie von Internetinformationsdienste (INTERNET Information Services, IIS) und ASP.NET gehostet. Wenn Sie einen Dienst in IIS oder WAS hosten, kann der Dienst automatisch aktiviert werden, wenn zum ersten Mal darauf zugegriffen wird.

Hinweis

Wenn Sie lieber mit einem Beispiel beginnen möchten, das den Dienst in einer Konsolenanwendung anstelle von IIS hosten soll, lesen Sie das Self-Host-Beispiel .

Der Dienst und der Client geben Zugriffsdetails in konfigurationsdateieinstellungen an, die flexibilität zum Zeitpunkt der Bereitstellung bieten. Dazu gehört eine Endpunktdefinition, die eine Adresse, Bindung und einen Vertrag angibt. Die Bindung gibt Transport- und Sicherheitsdetails für den Zugriff auf den Dienst an.

Der Dienst konfiguriert ein Laufzeitverhalten, um seine Metadaten zu veröffentlichen.

Der Dienst implementiert einen Vertrag, der ein Kommunikationsmuster für die Anforderungsantwort definiert. Der Vertrag wird durch die ICalculator Schnittstelle definiert, die mathematische Operationen verfügbar macht (addieren, subtrahieren, multiplizieren und dividieren). Der Client sendet Anforderungen an einen bestimmten mathematischen Vorgang, und der Dienst antwortet mit dem Ergebnis. Der Dienst implementiert einen ICalculator Vertrag, der im folgenden Code definiert ist.

' Define a service contract.
    <ServiceContract(Namespace:="http://Microsoft.Samples.GettingStarted")>
     Public Interface ICalculator
        <OperationContract()>
        Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()>
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    End Interface
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

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

' Service class which implements the service contract.
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Return n1 + n2
End Function

Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return n1 - n2
End Function

Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return n1 * n2
End Function

Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Return n1 / n2
End Function
End Class
// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

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

<services>
    <service
        name="Microsoft.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="Microsoft.ServiceModel.Samples.ICalculator" />
       ...
    </service>
</services>

Der Dienst macht den Endpunkt an der Basisadresse verfügbar, die vom IIS- oder WAS-Host bereitgestellt wird. Die Bindung ist mit einem Standard WSHttpBindingkonfiguriert, der HTTP-Kommunikations- und Standardwebdienstprotokolle zur Adressierung und Sicherheit bereitstellt. Bei dem Vertrag handelt es sich um den vom Dienst implementierten ICalculator.

In der konfigurierten Form kann der Dienst von einem Client auf demselben Computer unter http://localhost/servicemodelsamples/service.svc zugegriffen werden. Damit Clients auf Remotecomputern auf den Dienst zugreifen können, muss anstelle von localhost ein vollqualifizierter Domänenname angegeben werden.

Das Framework macht metadaten standardmäßig nicht verfügbar. Daher aktiviert der Dienst ServiceMetadataBehavior und macht unter http://localhost/servicemodelsamples/service.svc/mex einen Metadatenaustausch-Endpunkt (MEX-Endpunkt) verfügbar. Die folgende Konfiguration veranschaulicht dies.

<system.serviceModel>
  <services>
    <service
        name="Microsoft.ServiceModel.Samples.CalculatorService"
        behaviorConfiguration="CalculatorServiceBehavior">
      ...
      <!-- the mex endpoint is exposed 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 mithilfe eines bestimmten Vertragstyps mithilfe einer Clientklasse, die vom ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wird. Dieser generierte Client ist in der Datei generatedClient.cs oder generatedClient.vb enthalten. Dieses Hilfsprogramm ruft Metadaten für einen bestimmten Dienst ab und generiert einen Client für die Verwendung durch die Clientanwendung für die Kommunikation mit einem bestimmten Vertragstyp. Der gehostete Dienst muss verfügbar sein, um den Clientcode zu generieren, da der Dienst zum Abrufen der aktualisierten Metadaten verwendet wird.

Führen Sie den folgenden Befehl über die SDK-Eingabeaufforderung im Clientverzeichnis aus, um den typierten Proxy zu generieren:

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

Um den Client in Visual Basic zu generieren, geben Sie folgendes an der SDK-Eingabeaufforderung ein:

Svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb

Mithilfe des generierten Clients kann der Client auf einen bestimmten Dienstendpunkt zugreifen, indem er die entsprechende Adresse und Bindung konfiguriert. 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, die Bindung und den Vertrag, wie im folgenden Beispiel gezeigt.

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

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

' Create a client
Dim client As New CalculatorClient()

' Call the Add service operation.
            Dim value1 = 100.0R
            Dim value2 = 15.99R
            Dim result = client.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

' Call the Subtract service operation.
value1 = 145.00R
value2 = 76.54R
result = client.Subtract(value1, value2)
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result)

' Call the Multiply service operation.
value1 = 9.00R
value2 = 81.25R
result = client.Multiply(value1, value2)
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result)

' Call the Divide service operation.
value1 = 22.00R
value2 = 7.00R
result = client.Divide(value1, value2)
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result)

'Closing the client gracefully closes the connection and cleans up resources
// 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);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

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

Wenn Sie das Beispiel ausführen, werden die Vorgangsanforderungen und -antworten im Clientkonsolenfenster angezeigt. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Das Beispiel "Erste Schritte" zeigt die Standardmethode zum Erstellen eines Diensts und Clients. Die anderen einfachen Beispiele bauen auf diesem Beispiel auf, um bestimmte Produktfunktionen zu veranschaulichen.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.

  2. Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.

  3. Führen Sie das Beispiel in einer Einzel- oder computerübergreifenden Konfiguration aus, indem Sie die Anweisungen unter Ausführen der Windows Communication Foundation-Beispiele befolgen.

Siehe auch