C# Language
Windows Communication Foundation
Zoeken…
Invoering
Windows Communication Foundation (WCF) is een raamwerk voor het bouwen van servicegeoriënteerde applicaties. Met WCF kunt u gegevens als asynchrone berichten van het ene service-eindpunt naar het andere verzenden. Een service-eindpunt kan onderdeel zijn van een continu beschikbare service die wordt gehost door IIS, of het kan een service zijn die wordt gehost in een toepassing. De berichten kunnen zo simpel zijn als een enkel teken of woord verzonden als XML, of zo complex als een stroom van binaire gegevens.
Aan de slag-voorbeeld
De service beschrijft de bewerkingen die het uitvoert in een servicecontract dat het openbaar maakt als metadata.
// Define a service contract.
[ServiceContract(Namespace="http://StackOverflow.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
}
De service-implementatie berekent en retourneert het juiste resultaat, zoals weergegeven in de volgende voorbeeldcode.
// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
}
De service biedt een eindpunt voor communicatie met de service, gedefinieerd met behulp van een configuratiebestand (Web.config), zoals weergegeven in de volgende voorbeeldconfiguratie.
<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>
Het framework geeft standaard geen metagegevens weer. Als zodanig wordt de ServiceMetadataBehavior ingeschakeld en wordt een eindpunt van metadata-uitwisseling (MEX) weergegeven op http: //localhost/servicemodelsamples/service.svc/mex . De volgende configuratie demonstreert dit.
<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>
De client communiceert met behulp van een bepaald contracttype met behulp van een clientklasse die wordt gegenereerd door de ServiceModel Metadata Utility Tool (Svcutil.exe).
Voer de volgende opdracht uit vanaf de SDK-opdrachtprompt in de clientmap om de getypte proxy te genereren:
svcutil.exe /n:"http://StackOverflow.ServiceModel.Samples,StackOverflow.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs
Net als de service gebruikt de client een configuratiebestand (App.config) om het eindpunt op te geven waarmee hij wil communiceren. De client-eindpuntconfiguratie bestaat uit een absoluut adres voor het service-eindpunt, de binding en het contract, zoals getoond in het volgende voorbeeld.
<client>
<endpoint
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
contract="StackOverflow.ServiceModel.Samples.ICalculator" />
</client>
De clientimplementatie instantieert de client en gebruikt de getypte interface om te communiceren met de service, zoals weergegeven in de volgende voorbeeldcode.
// 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();