Partilhar via


Contrato de mensagem padrão

O exemplo de Contrato de Mensagem Padrão demonstra um serviço em que uma mensagem personalizada definida pelo usuário é passada de e para operações de serviço. Este exemplo é baseado na Introdução que implementa uma interface de calculadora como um serviço digitado. Em vez das operações de serviço individuais para adição, subtração, multiplicação e divisão usadas na Introdução, este exemplo passa uma mensagem personalizada que contém os operandos e o operador e retorna o resultado do cálculo aritmético.

O cliente é um programa de console (.exe) e a biblioteca de serviços (.dll) é hospedada pelo IIS (Serviços de Informações da Internet). A atividade do cliente é visível na janela do console.

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

No serviço, é definida uma única operação de serviço que aceita e retorna mensagens personalizadas do tipo MyMessage. Embora neste exemplo as mensagens de solicitação e resposta sejam do mesmo tipo, elas podem, é claro, ser contratos de mensagem diferentes, se necessário.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract(Action="http://test/MyMessage_action",
                  ReplyAction="http://test/MyMessage_action")]
    MyMessage Calculate(MyMessage request);
}

A mensagem MyMessage personalizada é definida em uma classe anotada com MessageContractAttributee MessageHeaderAttributeMessageBodyMemberAttribute atributos. Apenas o terceiro construtor é usado neste exemplo. O uso de contratos de mensagem permite que você exerça controle total sobre a mensagem SOAP. Neste exemplo, o MessageHeaderAttribute atributo é usado para colocar Operation em um cabeçalho SOAP. Os operandos N1e N2 os Result aparecem dentro do corpo SOAP porque têm o MessageBodyMemberAttribute atributo aplicado.

[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; }
    }
}

A classe de implementação contém o código para a Calculate operação de serviço. A CalculateService classe obtém os operandos e o operador da mensagem de solicitação e cria uma mensagem de resposta que contém o resultado do cálculo solicitado, conforme mostrado no código de exemplo a seguir.

// 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;
    }
}

O código do cliente gerado para o cliente foi criado com a ferramenta ServiceModel Metadata Utility Tool (Svcutil.exe ). A ferramenta cria automaticamente tipos de contrato de mensagem no código de cliente gerado, se necessário. A /messageContract opção de comando pode ser especificada para forçar a geração de contratos de mensagem.

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex

O código de exemplo a seguir demonstra o cliente usando a MyMessage mensagem.

// 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);

Quando você executa o exemplo, os cálculos são exibidos na janela do console do cliente. Pressione ENTER na janela do cliente para desligar o cliente.

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.

Neste ponto, mensagens personalizadas definidas pelo usuário passaram entre o cliente e a operação de serviço. O contrato de mensagem definia que os operandos e os resultados estavam no corpo da mensagem e que o operador estava em um cabeçalho de mensagem. O registro de mensagens pode ser configurado para observar essa estrutura de mensagens.

Para configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.