Standaardberichtcontract
In het voorbeeld van het standaardberichtcontract ziet u een service waarin een aangepast door de gebruiker gedefinieerd bericht wordt doorgegeven aan en van servicebewerkingen. Dit voorbeeld is gebaseerd op de Aan de slag die een rekenmachineinterface implementeert als een getypte service. In plaats van de afzonderlijke servicebewerkingen voor optellen, aftrekken, vermenigvuldigen en delen die in de Aan de slag worden gebruikt, geeft dit voorbeeld een aangepast bericht door dat zowel de operanden als de operator bevat en het resultaat van de rekenkundige berekening retourneert.
De client is een consoleprogramma (.exe) en de servicebibliotheek (.dll) wordt gehost door Internet Information Services (IIS). Clientactiviteit is zichtbaar in het consolevenster.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
In de service wordt één servicebewerking gedefinieerd die aangepaste berichten van het type MyMessage
accepteert en retourneert. Hoewel in dit voorbeeld de aanvraag- en antwoordberichten van hetzelfde type zijn, kunnen ze natuurlijk verschillende berichtcontracten zijn, indien nodig.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract(Action="http://test/MyMessage_action",
ReplyAction="http://test/MyMessage_action")]
MyMessage Calculate(MyMessage request);
}
Het aangepaste bericht MyMessage
wordt gedefinieerd in een klasse met aantekeningen MessageBodyMemberAttribute en MessageContractAttributeMessageHeaderAttribute kenmerken. Alleen de derde constructor wordt in dit voorbeeld gebruikt. Met berichtcontracten kunt u volledige controle uitoefenen over het SOAP-bericht. In dit voorbeeld wordt het MessageHeaderAttribute kenmerk gebruikt om een SOAP-header in te zetten Operation
. De operanden N1
N2
en het Result
verschijnen in de SOAP-hoofdtekst omdat het MessageBodyMemberAttribute kenmerk is toegepast.
[MessageContract]
public class MyMessage
{
private string operation;
private double n1;
private double n2;
private double result;
//Constructor - create an empty message.
public MyMessage() {}
//Constructor - create a message and populate its members.
public MyMessage(double n1, double n2, string operation,
double result)
{
this.n1 = n1;
this.n2 = n2;
this.operation = operation;
this.result = result;
}
//Constructor - create a message from another message.
public MyMessage(MyMessage message)
{
this.n1 = message.n1;
this.n2 = message.n2;
this.operation = message.operation;
this.result = message.result;
}
[MessageHeader]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[MessageBodyMember]
public double N1
{
get { return n1; }
set { n1 = value; }
}
[MessageBodyMember]
public double N2
{
get { return n2; }
set { n2 = value; }
}
[MessageBodyMember]
public double Result
{
get { return result; }
set { result = value; }
}
}
De implementatieklasse bevat de code voor de Calculate
servicebewerking. De CalculateService
klasse verkrijgt de operanden en operator van het aanvraagbericht en maakt een antwoordbericht dat het resultaat van de aangevraagde berekening bevat, zoals wordt weergegeven in de volgende voorbeeldcode.
// Service class which implements the service contract.
public class CalculatorService : ICalculator
{
// Perform a calculation.
public MyMessage Calculate(MyMessage request)
{
MyMessage response = new MyMessage(request);
switch (request.Operation)
{
case "+":
response.Result = request.N1 + request.N2;
break;
case "-":
response.Result = request.N1 - request.N2;
break;
case "*":
response.Result = request.N1 * request.N2;
break;
case "/":
response.Result = request.N1 / request.N2;
break;
default:
response.Result = 0.0D;
break;
}
return response;
}
}
De gegenereerde clientcode voor de client is gemaakt met het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe). Het hulpprogramma maakt automatisch berichtcontracttypen in de gegenereerde clientcode, indien nodig. De /messageContract
opdrachtoptie kan worden opgegeven om het genereren van berichtcontracten af te dwingen.
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
De volgende voorbeeldcode demonstreert de client met behulp van het MyMessage
bericht.
// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();
// Perform addition using a typed message.
MyMessage request = new MyMessage()
{
N1 = 100D,
N2 = 15.99D,
Operation = "+"
};
MyMessage response = ((ICalculator)client).Calculate(request);
Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result);
Wanneer u het voorbeeld uitvoert, worden de berekeningen 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.
Op dit moment zijn aangepaste door de gebruiker gedefinieerde berichten doorgegeven tussen de client en de servicebewerking. Het berichtcontract definieerde dat de operanden en resultaten zich in de berichttekst bevonden en dat de operator zich in een berichtkop bevond. Logboekregistratie van berichten kan worden geconfigureerd om deze berichtstructuur te observeren.
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 met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.