Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Exemplet standardmeddelandekontrakt visar en tjänst där ett anpassat användardefinierat meddelande skickas till och från tjänståtgärder. Det här exemplet baseras på komma igång som implementerar ett kalkylatorgränssnitt som en typbaserad tjänst. I stället för de enskilda tjänståtgärderna för addition, subtraktion, multiplikation och division som används i komma igång skickar det här exemplet ett anpassat meddelande som innehåller både operanderna och operatorn och returnerar resultatet av den aritmetiska beräkningen.
Klienten är ett konsolprogram (.exe) och tjänstbiblioteket (.dll) hanteras av Internet Information Services (IIS). Klientaktiviteten visas i konsolfönstret.
Anmärkning
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
I tjänsten definieras en enskild tjänståtgärd som accepterar och returnerar anpassade meddelanden av typen MyMessage. I det här exemplet är begärande- och svarsmeddelanden av samma typ, men de kan naturligtvis vara olika meddelandekontrakt om det behövs.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract(Action="http://test/MyMessage_action",
ReplyAction="http://test/MyMessage_action")]
MyMessage Calculate(MyMessage request);
}
Det anpassade meddelandet MyMessage definieras i en klass som har kommenterats med MessageContractAttribute, MessageHeaderAttribute och MessageBodyMemberAttribute attribut. Endast den tredje konstruktorn används i det här exemplet. Med hjälp av meddelandekontrakt kan du utöva fullständig kontroll över SOAP-meddelandet. I det här exemplet används attributet MessageHeaderAttribute för att placera Operation i en SOAP-header. Operanderna N1och N2Result visas i SOAP-brödtexten eftersom de har attributet MessageBodyMemberAttribute tillämpat.
[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; }
}
}
Implementeringsklassen innehåller koden för tjänståtgärden Calculate . Klassen CalculateService hämtar operanderna och operatorn från begärandemeddelandet och skapar ett svarsmeddelande som innehåller resultatet av den begärda beräkningen, enligt följande exempelkod.
// 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;
}
}
Den genererade klientkoden för klienten skapades med verktyget ServiceModel Metadata Utility (Svcutil.exe). Verktyget skapar automatiskt meddelandekontraktstyper i den genererade klientkoden om det behövs. Kommandoalternativet /messageContract kan anges för att framtvinga genereringen av meddelandekontrakt.
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
Följande exempelkod visar klienten som använder meddelandet MyMessage.
// 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);
När du kör exemplet visas beräkningarna i klientkonsolfönstret. Tryck på RETUR i klientfönstret för att stänga av klienten.
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.
Nu har anpassade användardefinierade meddelanden skickats mellan klienten och tjänståtgärden. Meddelandekontraktet definierade att operanderna och resultaten fanns i meddelandetexten och att operatorn var i ett meddelandehuvud. Meddelandeloggning kan konfigureras för att observera den här meddelandestrukturen.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört One-Time installationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.