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
Vous devez vous connecter pour publier un commentaire.
IIRC, WCF utilise par défaut le "Enveloppé" message du style. Si vous voulez être en mesure de contrôler la façon dont les messages sont sérialisés, vous pouvez définir des messages explicites en la décorant avec le MessageContractAttribute. Avec un message explicite des contrats, vous pouvez définir la IsWrapped propriété
false
.Dans votre cas, je pense que EchoRequest et EchoResponse ne devrait pas être DataContracts à tous, mais plutôt MessageContracts. Ils ressemblent beaucoup à des MessageContracts pour moi.
OriginalL'auteur Mark Seemann
J'ai finalement basculé à l'utilisation Les Contrats De Message à l'aide d'un TypedMessageConverter qui m'a présenté via à cette question, la réponse de. C'est la pièce manquante ici.
OriginalL'auteur codekaizen