Domyślny kontrakt komunikatów
Przykładowy domyślny kontrakt komunikatów przedstawia usługę, w której jest przekazywany niestandardowy komunikat zdefiniowany przez użytkownika do i z operacji usługi. Ten przykład jest oparty na rozpoczynaniu pracy , który implementuje interfejs kalkulatora jako usługę typizowanej. Zamiast pojedynczych operacji usługi na potrzeby dodawania, odejmowania, mnożenia i dzielenia używanego w metodzie Wprowadzenie ten przykład przekazuje niestandardowy komunikat zawierający zarówno operandy, jak i operator oraz zwraca wynik obliczenia arytmetycznego.
Klient jest programem konsoli (.exe), a biblioteka usług (.dll) jest hostowana przez usługi Internet Information Services (IIS). Działanie klienta jest widoczne w oknie konsoli.
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
W usłudze zdefiniowano jedną operację usługi, która akceptuje i zwraca niestandardowe komunikaty typu MyMessage
. Chociaż w tym przykładzie komunikaty żądania i odpowiedzi są tego samego typu, mogą one oczywiście być różnymi kontraktami komunikatów w razie potrzeby.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract(Action="http://test/MyMessage_action",
ReplyAction="http://test/MyMessage_action")]
MyMessage Calculate(MyMessage request);
}
Komunikat MyMessage
niestandardowy jest definiowany w klasie z adnotacjami z atrybutami MessageHeaderAttributeMessageContractAttributei MessageBodyMemberAttribute . W tym przykładzie jest używany tylko trzeci konstruktor. Korzystanie z kontraktów komunikatów umożliwia wykonywanie pełnej kontroli nad komunikatem SOAP. W tym przykładzie MessageHeaderAttribute atrybut jest używany do umieszczenia Operation
w nagłówku protokołu SOAP. Operandy N1
N2
i Result
pojawiają się w treści protokołu SOAP, ponieważ mają MessageBodyMemberAttribute zastosowany atrybut.
[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; }
}
}
Klasa implementacji zawiera kod operacji Calculate
usługi. Klasa CalculateService
uzyskuje operandy i operator z komunikatu żądania i tworzy komunikat odpowiedzi zawierający wynik żądanego obliczenia, jak pokazano w poniższym przykładowym kodzie.
// 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;
}
}
Wygenerowany kod klienta dla klienta został utworzony za pomocą narzędzia ServiceModel Metadata Tool (Svcutil.exe). Narzędzie automatycznie tworzy typy kontraktów komunikatów w wygenerowany kod klienta w razie potrzeby. /messageContract
Można określić opcję polecenia, aby wymusić generowanie kontraktów komunikatów.
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
Poniższy przykładowy kod demonstruje klienta przy użyciu komunikatu 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);
Po uruchomieniu przykładu obliczenia są wyświetlane w oknie konsoli klienta. Naciśnij klawisz ENTER w oknie klienta, aby zamknąć klienta.
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.
W tym momencie niestandardowe komunikaty zdefiniowane przez użytkownika zostały przekazane między klientem a operacją usługi. Kontrakt komunikatu zdefiniował, że operandy i wyniki znajdowały się w treści komunikatu i że operator znajdował się w nagłówku komunikatu. Rejestrowanie komunikatów można skonfigurować tak, aby obserwować tę strukturę komunikatów.
Aby skonfigurować, skompilować i uruchomić przykład
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.