Mensagens desempacotadas

O exemplo Unwrapped demonstra mensagens desempacotadas. Por padrão, o corpo da mensagem é formatado de forma que os parâmetros para uma operação de serviço sejam encapsulados. O exemplo a seguir mostra uma Add mensagem de solicitação para o ICalculator serviço no modo encapsulado.

<s:Envelope
    xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://schemas.xmlsoap.org/ws/2005/08/addressing">
    <s:Header>
        …
    </s:Header>
    <s:Body>
      <Add xmlns="http://Microsoft.ServiceModel.Samples">
        <n1>100</n1>
        <n2>15.99</n2>
      </Add>
    </s:Body>
</s:Envelope>

O <Add> elemento no corpo da mensagem encapsula os n1 parâmetros e n2 . Por outro lado, o exemplo a seguir mostra a mensagem equivalente no modo desempacotado.

<s:Envelope
    xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://schemas.xmlsoap.org/ws/2005/08/addressing">
    <s:Header>
        ….
    </s:Header>
    <s:Body>
      <n1 xmlns="http://Microsoft.ServiceModel.Samples">100</n1>
      <n2 xmlns="http://Microsoft.ServiceModel.Samples">15.99</n2>
    </s:Body>
  </s:Envelope>

A mensagem desembrulhada não envolve os n1 parâmetros e n2 em um elemento de contenção, eles são filhos diretos do elemento soap body.

Nota

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

Neste exemplo, uma mensagem desempacotada é criada aplicando o MessageContractAttribute tipo de parâmetro à operação de serviço e o tipo de valor de retorno, conforme mostrado no código de exemplo a seguir.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    ResponseMessage Add(RequestMessage request);
    [OperationContract]
    ResponseMessage Subtract(RequestMessage request);
    [OperationContract]
    ResponseMessage Multiply(RequestMessage request);
    [OperationContract]
    ResponseMessage Divide(RequestMessage request);
}

//setting IsWrapped to false means the n1 and n2
//members will be direct children of the soap body element
[MessageContract(IsWrapped = false)]
public class RequestMessage
{
    [MessageBodyMember]
    private double n1;
    [MessageBodyMember]
    private double n2;
    //…
}

//setting IsWrapped to false means the result
//member will be a direct child of the soap body element
[MessageContract(IsWrapped = false)]
public class ResponseMessage
{
    [MessageBodyMember]
    private double result;
    //…
}

Para permitir que você veja as mensagens que estão sendo enviadas e recebidas, este exemplo usa rastreamento. Além disso, o WSHttpBinding foi configurado sem segurança, para reduzir o número de mensagens que registra.

O log de rastreamento resultante (c:\logs\Message.log) pode ser exibido usando a ferramenta Service Trace Viewer Tool (SvcTraceViewer.exe). Para exibir o conteúdo da mensagem, selecione Mensagens nos painéis esquerdo e direito da ferramenta Visualizador de Rastreamento de Serviço. Os logs de rastreamento neste exemplo são configurados para serem gerados na pasta C:\LOGS. Crie esta pasta antes de executar o exemplo e dê ao usuário permissões de gravação do Serviço de Rede para esse diretório.

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. Crie um diretório C:\LOGS para registrar mensagens. Conceda ao usuário permissões de gravação do Serviço de Rede para este diretório.

  3. 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.

  4. 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.