Windows Communication Foundation

Windows Communication Foundation

Windows Communication Foundation (WCF) är ett ramverk för att bygga tjänsteorienterade applikationer. Med WCF kan du skicka data som asynkrona meddelanden från en tjänstslutpunkt till en annan. En tjänstslutpunkt kan vara en del av en kontinuerligt tillgänglig tjänst som IIS är värd för, eller så kan den vara en tjänst som är värd i en applikation. Meddelanden kan vara så enkla som ett enda tecken eller ord som skickas som XML, eller så komplexa som en ström av binär data.

# Komma igång exempel

Tjänsten beskriver de operationer den utför i ett tjänstekontrakt som den exponerar offentligt som metadata.

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

Tjänstimplementeringen beräknar och returnerar lämpligt resultat, som visas i följande exempelkod.

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

Tjänsten exponerar en slutpunkt för kommunikation med tjänsten, definierad med hjälp av en konfigurationsfil (Web.config), som visas i följande exempelkonfiguration.

<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>

Ramverket exponerar inte metadata som standard. Som sådan slår tjänsten på ServiceMetadataBehavior och exponerar en metadata Exchange-slutpunkt (MEX) på http://localhost/servicemodelsamples/service.svc/mex . Följande konfiguration visar detta.

<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>  

Klienten kommunicerar med en given kontraktstyp genom att använda en klientklass som genereras av ServiceModel Metadata Utility Tool (Svcutil.exe).

Kör följande kommando från SDK-kommandotolken i klientkatalogen för att generera den typade proxyn:

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

Precis som tjänsten använder klienten en konfigurationsfil (App.config) för att specificera den slutpunkt som den vill kommunicera med. Klientens slutpunktskonfiguration består av en absolut adress för tjänstens slutpunkt, bindningen och kontraktet, som visas i följande exempel.

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

Klientimplementeringen instansierar klienten och använder det maskinskrivna gränssnittet för att börja kommunicera med tjänsten, som visas i följande exempelkod.

// 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