Pourquoi ne WCF envelopper de demande/réponse de types dans un autre élément XML, et comment éviter cela?

J'ai un simple service d'écho où j'ai défini une méthode de fonctionnement et d'une paire de types de demande/réponse:

[ServiceContract(Name = "EchoService", 
                 Namespace = "http://example.com/services", 
                 SessionMode = SessionMode.NotAllowed)]
public interface IEchoService
{
    [OperationContract(IsOneWay = false,
                       Action = "http://example.com/services/EchoService/Echo", 
                       ReplyAction = "http://example.com/services/EchoService/EchoResponse")]
    EchoResponse Echo(EchoRequest value);
}

Les types de données:

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }

    public EchoRequest(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoResponse")]
public class EchoResponse
{
    public EchoResponse() { }

    public EchoResponse(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

Invoquant Message.CreateMessage() sur une instance de EchoRequest rendements:

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
        <Value>hello, world!</Value>
      </EchoRequest>
    </s:Body>
  </s:Envelope>

...ce qui est exactement ce que je veux. Cependant, il apparaît que le service sattend à ce que le corps du message pour être encore enveloppé dans un autre élément XML, comme ceci:

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <Echo xmlns="http://example.com/services">
        <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
          <Value>hello, world!</Value>
        </EchoRequest>
      </Echo>
    </s:Body>
  </s:Envelope>

Mise à JOUR:
Grâce à la Marque de répondre, j'ai exploré MessageContract au lieu de DataContract sur la demande/les types de réponses. Ce qui semble plus proche de ce que je veux, mais maintenant ça va trop loin, et ne s'attend à l'extérieur type d'élément, "EchoRequest".

C'est source de confusion car en quelque sorte de Message.CreateMessage semble immanquablement produire la bonne XML, il est donc apparemment en utilisant certains sérialisation par défaut que je voudrais configurer le service pour qu'il accepte. Je suis juste de l'incompréhension comment Message.CreateMessage fonctionne?

OriginalL'auteur codekaizen | 2009-07-15