Windows Communication Foundation (WCF) to platforma do tworzenia aplikacji zorientowanych na usługi. Korzystając z WCF, możesz wysyłać dane jako komunikaty asynchroniczne z jednego punktu końcowego usługi do drugiego. Punkt końcowy usługi może być częścią stale dostępnej usługi hostowanej przez usługi IIS lub może być usługą hostowaną w aplikacji. Komunikaty mogą być tak proste, jak pojedynczy znak lub słowo wysłane jako XML, lub tak złożone, jak strumień danych binarnych.
# Próbka startowa
Usługa opisuje operacje, które wykonuje w umowie o świadczenie usług, które udostępnia publicznie jako metadane.
// Define a service contract.
[ServiceContract(Namespace="http://StackOverflow.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
}
Implementacja usługi oblicza i zwraca odpowiedni wynik, jak pokazano w poniższym przykładowym kodzie.
// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
}
Usługa udostępnia punkt końcowy do komunikacji z usługą, zdefiniowany za pomocą pliku konfiguracyjnego (Web.config), jak pokazano w poniższej przykładowej konfiguracji.
<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>
Struktura domyślnie nie udostępnia metadanych. W związku z tym usługa włącza ServiceMetadataBehavior i udostępnia punkt końcowy wymiany metadanych (MEX) pod adresem http://localhost/servicemodelsamples/service.svc/mex . Poniższa konfiguracja pokazuje to.
<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>
Klient komunikuje się przy użyciu danego typu kontraktu przy użyciu klasy klienta, która jest generowana przez narzędzie ServiceModel Metadata Utility Tool (Svcutil.exe).
Uruchom następujące polecenie z wiersza poleceń SDK w katalogu klienta, aby wygenerować wpisane proxy:
svcutil.exe /n:"http://StackOverflow.ServiceModel.Samples,StackOverflow.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs
Podobnie jak usługa, klient używa pliku konfiguracyjnego (App.config) do określenia punktu końcowego, z którym chce się komunikować. Konfiguracja punktu końcowego klienta składa się z adresu bezwzględnego punktu końcowego usługi, powiązania i kontraktu, jak pokazano w poniższym przykładzie.
<client>
<endpoint
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
contract="StackOverflow.ServiceModel.Samples.ICalculator" />
</client>
Implementacja klienta tworzy instancję klienta i używa wpisanego interfejsu do rozpoczęcia komunikacji z usługą, jak pokazano w poniższym przykładowym kodzie.
// 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();