Поделиться через


Контракт сообщения по умолчанию

В примере контракта сообщения по умолчанию показана служба, где пользовательское определяемое сообщение передается в и из операций службы. Этот пример основан на начальном примере 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.

На этом этапе пользовательски определённые сообщения переданы между клиентом и операцией службы. Контракт сообщения определил, что операнды и результаты были в тексте сообщения и что оператор был в заголовке сообщения. Ведение журнала сообщений можно настроить для наблюдения за этой структурой сообщений.

Настройка, сборка и запуск примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.