Partilhar via


Solicitação/resposta não digitada

O exemplo Untyped demonstra como definir contratos de operação que usam a classe Message.

Observação

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

Este exemplo é baseado em Introdução. O contrato de serviço define uma operação que recebe um tipo de mensagem como um argumento e retorna uma mensagem. A operação coleta todos os dados necessários para calcular a soma do corpo da mensagem e, em seguida, envia a soma como corpo na mensagem de retorno.

[OperationContract(Action = CalculatorService.RequestAction, ReplyAction = CalculatorService.ReplyAction)]
Message ComputeSum(Message request);

No serviço, a operação recupera a matriz de inteiros passados na mensagem de entrada e, em seguida, calcula a soma. Para enviar uma resposta, o exemplo cria uma nova mensagem com a versão apropriada da mensagem e ação, e adiciona a soma computada como conteúdo. O código de exemplo a seguir demonstra isso.

public Message ComputeSum(Message request)
{
    //The body of the message contains a list of numbers which will be
    //read as a int[] using GetBody<T>
    int result = 0;

    int[] inputs = request.GetBody<int[]>();
    foreach (int i in inputs)
    {
        result += i;
    }

    Message response = Message.CreateMessage(request.Version,
                                      ReplyAction, result);
    return response;
}

O cliente usa o código gerado pela ServiceModel Metadata Utility Tool (Svcutil.exe) para criar um proxy para o serviço remoto. Para enviar uma mensagem de solicitação, o cliente deve ter a versão da mensagem, que depende do canal subjacente. Assim, ele cria um novo OperationContextScope escopado ao canal proxy que ele criou, o que gera uma OperationContext com a versão correta da mensagem preenchida na sua propriedade OutgoingMessageHeaders.MessageVersion. O cliente passa uma matriz de entrada como o corpo para a mensagem de solicitação e, em seguida, invoca o ComputeSum no proxy. Em seguida, o cliente recupera a soma das entradas passadas acessando o GetBody<T> método na mensagem de resposta. O código de exemplo a seguir demonstra isso.

using (new OperationContextScope(client.InnerChannel))
{
    // Call the Sum service operation.
    int[] values = { 1, 2, 3, 4, 5 };
    Message request = Message.CreateMessage(
        OperationContext.Current.OutgoingMessageHeaders.MessageVersion,
        RequestAction, values);
    Message reply = client.ComputeSum(request);
    int response = reply.GetBody<int>();

    Console.WriteLine("Sum of numbers passed (1,2,3,4,5) = {0}",
                                                       response);
}

Este exemplo é um exemplo hospedado na Web e, portanto, apenas o executável do cliente deve ser executado. A seguir está a saída de exemplo no cliente.

Prompt>Client.exe
Sum of numbers passed (1,2,3,4,5) = 15

Press <ENTER> to terminate client.

Este exemplo é um exemplo hospedado na Web e, portanto, verifique o link fornecido na etapa 3 para ver como criar e executar o exemplo.

Para configurar, compilar e executar o exemplo

  1. Verifique se você executou o procedimento de instalação do One-Time 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.