Comparteix via


Mensajes desenvueltos

En este ejemplo se muestran los mensajes no encapsulados. De forma predeterminada, el cuerpo del mensaje tiene formato de modo que los parámetros de una operación de servicio se encapsulan. En el ejemplo siguiente se muestra un mensaje de solicitud Add al servicio ICalculator en 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>

El <Add> se coloca en el cuerpo del mensaje y envuelve los parámetros n1 y n2. En cambio, en el ejemplo siguiente se muestra el mensaje equivalente en el modo desencapsulado.

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

El mensaje desajustado no ajusta los parámetros n1 y n2 en un elemento contenedor, sino que son elementos secundarios directos del elemento del cuerpo de SOAP.

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

En este ejemplo, se crea un mensaje desencapsulado aplicando al MessageContractAttribute tipo de parámetro de operación de servicio y el tipo de valor devuelto, tal como se muestra en el código de ejemplo siguiente.

[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 permitirle ver los mensajes que se envían y reciben, en este ejemplo se usa el seguimiento. Además, WSHttpBinding se ha configurado sin seguridad para reducir el número de mensajes que registra.

El registro de seguimiento resultante (c:\logs\Message.log) se puede ver mediante la herramienta visor de seguimiento de servicio (SvcTraceViewer.exe). Para ver el contenido del mensaje, seleccione Mensajes en los paneles izquierdo y derecho de la herramienta Visor de seguimiento de servicio. Los registros de seguimiento de este ejemplo están configurados para generarse en la carpeta C:\LOGS. Cree esta carpeta antes de ejecutar el ejemplo y asigne al usuario permisos de escritura del servicio de red para este directorio.

Para configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Cree un directorio C:\LOGS para registrar mensajes. Conceda al usuario permisos de escritura del servicio de red para este directorio.

  3. Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.

  4. Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.