~fhusson

WCF WSDL SOAP binding, Rpc or Document, Encoded or Literal

Yeah, my new WebService must be Rpc/Encoded. What ????

Hopefully this page from Ibm explain the different style/use in SOAP message.

A WSDL document describes a Web service. A WSDL binding describes how the service is bound to a messaging protocol, particularly the SOAP messaging protocol. A WSDL SOAP binding can be either a Remote Procedure Call (RPC) style binding or a document style binding. A SOAP binding can also have an encoded use or a literal use.

Ok now I know that four style/use models:

RPC/Encoded, RPC/literal, Document/encoded or Document/literal

But how do I do that in WCF C# ?? It’s very easy, just use the [XmlSerializerFormat] attribute.

Here is a very very simple test to check the different result in the soap message:

Interface of the Wcf service used

using System.ServiceModel;

namespace WcfService1
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [XmlSerializerFormat(Style = OperationFormatStyle.Rpc, Use = OperationFormatUse.Encoded)]
        string TestRpcEncoded(int value);

        [OperationContract]
        [XmlSerializerFormat(Style = OperationFormatStyle.Rpc, Use = OperationFormatUse.Literal)]
        string TestRpcLiteral(int value);

        //[OperationContract]
        //[XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Encoded)]
        //string TestDocumentEncoded(int value);

        [OperationContract]
        [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]
        string TestDocumentLiteral(int value);
    }
}

Result captured on the network with fiddler

For clarity, I have removed:

RPC / Encoded call

<!-- Request -->
<s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <q1:TestRpcEncoded>
    <value xsi:type="xsd:int">42</value>
  </q1:TestRpcEncoded>
</s:Body>

<!-- Response -->
<s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <q1:TestRpcEncodedResponse>
    <TestRpcEncodedResult xsi:type="xsd:string">You entered: 42</TestRpcEncodedResult>
  </q1:TestRpcEncodedResponse>
</s:Body>

RPC / Literal call

<!-- Request -->
<s:Body>
  <TestRpcLiteral>
    <value xmlns="">42</value>
  </TestRpcLiteral>
</s:Body>

<!-- Response -->
<s:Body>
  <TestRpcLiteralResponse>
    <TestRpcLiteralResult xmlns="">You entered: 42</TestRpcLiteralResult>
  </TestRpcLiteralResponse>
</s:Body>

Document / Encoded call

If you add the TestDocumentEncoded you will get an InvalidOperationException. This combination is not supported.

Document / Literal call

<!-- Request -->
<s:Body></code>
  <TestDocumentLiteral><value>42</value></TestDocumentLiteral>
</s:Body>

<!-- Response -->
<s:Body>
  <TestDocumentLiteralResponse>
    <TestDocumentLiteralResult>You entered: 42</TestDocumentLiteralResult>
  </TestDocumentLiteralResponse>
</s:Body>
Discuss on Twitter