Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере контракта сообщения по умолчанию показана служба, где пользовательское определяемое сообщение передается в и из операций службы. Этот пример основан на начальном примере Getting Started, которое реализует интерфейс калькулятора, представленного как типизированная служба. Вместо операций отдельных сервисов для сложения, вычитания, умножения и деления, как в Getting Started, этот пример передает пользовательское сообщение, содержащее как операнды, так и оператор, и возвращает результат арифметического вычисления.
Клиент представляет собой консольную программу (.exe), а библиотека служб (.dll) размещена на службах Internet Information Services (IIS). Действие клиента отображается в окне консоли.
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
В службе определяется одна операция службы, которая принимает и возвращает пользовательские сообщения типа MyMessage. Хотя в этом примере сообщения запроса и ответа имеют одинаковый тип, при необходимости они могут быть различными контрактами сообщений.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract(Action="http://test/MyMessage_action",
ReplyAction="http://test/MyMessage_action")]
MyMessage Calculate(MyMessage request);
}
Настраиваемое сообщение MyMessage определяется в классе, аннотированном атрибутами MessageContractAttribute, MessageHeaderAttribute и MessageBodyMemberAttribute. В этом примере используется только третий конструктор. Использование контрактов сообщений позволяет выполнять полный контроль над сообщением SOAP. В этом примере MessageHeaderAttribute атрибут используется для вставки Operation в заголовок SOAP. Операнды N1, N2 и Result отображаются в теле SOAP, так как к ним применён атрибут MessageBodyMemberAttribute.
[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; }
}
}
Класс реализации содержит код для Calculate операции службы. Класс CalculateService получает операнды и операторы из сообщения запроса и создает ответное сообщение, содержащее результат запрошенного вычисления, как показано в следующем примере кода.
// 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;
}
}
Созданный код клиента был создан с помощью средства служебной программы метаданных ServiceModel (Svcutil.exe) . При необходимости средство автоматически создает типы контрактов сообщений в созданном клиентском коде. Для принудительного создания контрактов сообщений может быть указан параметр команды /messageContract.
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
В следующем примере кода демонстрируется, как клиент использует сообщение 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);
При запуске примера вычисления отображаются в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.
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.
На этом этапе пользовательски определённые сообщения переданы между клиентом и операцией службы. Контракт сообщения определил, что операнды и результаты были в тексте сообщения и что оператор был в заголовке сообщения. Ведение журнала сообщений можно настроить для наблюдения за этой структурой сообщений.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.