'Aan de slag'-voorbeeld
Het Voorbeeld GettingStarted laat zien hoe u een typische service en een typische client implementeert met behulp van WCF (Windows Communication Foundation). Dit voorbeeld is de basis voor alle andere basistechnologievoorbeelden.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De service beschrijft de bewerkingen die worden uitgevoerd in een servicecontract dat openbaar wordt weergegeven als metagegevens. De service bevat ook de code voor het implementeren van de bewerkingen.
De client bevat een definitie van het servicecontract en een proxyklasse voor toegang tot de service. De proxycode wordt gegenereerd op basis van de metagegevens van de service met behulp van het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe).
Op Windows Vista wordt de service gehost in de Windows Activation Service (WAS). Op Windows XP en Windows Server 2003 wordt het gehost door Internet Information Services (IIS) en ASP.NET. Als u een service host in IIS of WAS, kan de service automatisch worden geactiveerd wanneer deze voor de eerste keer wordt geopend.
Notitie
Als u liever aan de slag wilt gaan met een voorbeeld dat als host fungeert voor de service in een consoletoepassing in plaats van IIS, raadpleegt u het voorbeeld selfhost.
De service en client geven toegangsdetails op in configuratiebestandsinstellingen, die flexibiliteit bieden op het moment van implementatie. Dit omvat een eindpuntdefinitie die een adres, binding en contract aangeeft. De binding geeft transport- en beveiligingsdetails op voor de wijze waarop de service moet worden geopend.
De service configureert een runtimegedrag om de metagegevens ervan te publiceren.
De service implementeert een contract dat een communicatiepatroon aanvraagantwoord definieert. Het contract wordt gedefinieerd door de ICalculator
interface, die wiskundige bewerkingen weergeeft (optellen, aftrekken, vermenigvuldigen en delen). De client doet aanvragen voor een bepaalde wiskundige bewerking en de service reageert met het resultaat. De service implementeert een ICalculator
contract dat is gedefinieerd in de volgende code.
' 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);
}
De service-implementatie berekent en retourneert het juiste resultaat, zoals wordt weergegeven in de volgende voorbeeldcode.
' 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;
}
}
De service maakt een eindpunt beschikbaar voor communicatie met de service, gedefinieerd met behulp van een configuratiebestand (Web.config), zoals wordt weergegeven in de volgende voorbeeldconfiguratie.
<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>
De service maakt het eindpunt beschikbaar op het basisadres dat wordt geleverd door de IIS- of WAS-host. De binding is geconfigureerd met een standaard WSHttpBinding, die HTTP-communicatie en standaardwebserviceprotocollen biedt voor adressering en beveiliging. Het contract is het ICalculator
contract dat door de service wordt geïmplementeerd.
Zoals geconfigureerd, kan de service worden geopend http://localhost/servicemodelsamples/service.svc
door een client op dezelfde computer. Voor clients op externe computers om toegang te krijgen tot de service, moet een volledig gekwalificeerde domeinnaam worden opgegeven in plaats van localhost.
In het framework worden standaard geen metagegevens weergegeven. Als zodanig schakelt de service het ServiceMetadataBehavior eindpunt voor metagegevensuitwisseling (MEX) in en maakt deze beschikbaar op http://localhost/servicemodelsamples/service.svc/mex
. In de volgende configuratie ziet u dit.
<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>
De client communiceert met behulp van een bepaald contracttype met behulp van een clientklasse die wordt gegenereerd door het hulpprogramma servicemodelmetagegevens (Svcutil.exe). Deze gegenereerde client bevindt zich in het bestand generatedClient.cs of generatedClient.vb. Dit hulpprogramma haalt metagegevens op voor een bepaalde service en genereert een client voor gebruik door de clienttoepassing om te communiceren met behulp van een bepaald contracttype. De gehoste service moet beschikbaar zijn om de clientcode te genereren, omdat de service wordt gebruikt om de bijgewerkte metagegevens op te halen.
Voer de volgende opdracht uit vanaf de SDK-opdrachtprompt in de clientmap om de getypte proxy te genereren:
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs
Als u een client wilt genereren in Visual Basic, typt u het volgende vanaf de SDK-opdrachtprompt:
Svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb
Door de gegenereerde client te gebruiken, heeft de client toegang tot een bepaald service-eindpunt door het juiste adres en de juiste binding te configureren. Net als de service gebruikt de client een configuratiebestand (App.config) om het eindpunt op te geven waarmee het wil communiceren. De configuratie van het clienteindpunt bestaat uit een absoluut adres voor het service-eindpunt, de binding en het contract, zoals wordt weergegeven in het volgende voorbeeld.
<client>
<endpoint
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
contract=" Microsoft.ServiceModel.Samples.ICalculator" />
</client>
De client-implementatie instantieert de client en gebruikt de getypte interface om te communiceren met de service, zoals wordt weergegeven in de volgende voorbeeldcode.
' 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();
Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het clientconsolevenster. Druk op Enter in het clientvenster om de client af te sluiten.
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.
In het voorbeeld Aan de slag ziet u de standaardmethode voor het maken van een service en client. De andere Basic-versie van dit voorbeeld om specifieke productfuncties te demonstreren.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie van één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.