Question

J'essaie de créer une implémentation WSTransfer (je réalise que Roman Kiss en a déjà écrit une pour la WCF, mais elle ne respecte pas les spécifications)

J'ai fini par abandonner les contrats de données sur les contacts de service car le transfert WST est faiblement couplé; de sorte que chaque message créé ressemble à un message créé (demande de message).

Cela fonctionne bien et tout est beau jusqu'au moment de répondre.

Le problème que j'ai est dans la façon dont une réponse WSTransfer est construite. En prenant create comme exemple, la réponse ressemble à

<wxf:ResourceCreated>
  <wsa:Address>....</wsa:Address>
  <wsa:ReferenceProperties>
    <xxx:MyID>....</xxx:MyId>
  </wsa:ReferenceProperties>
</wxf:ResourceCreated>

Comme vous pouvez le constater, le message de réponse contient 3 espaces de nom XML différents.

Maintenant, c’est assez facile quand on est impliqué; vous pouvez (même si vous ne l'exposez pas), créer un contrat de données, définir les valeurs et le réactiver

Message response = Message.CreateMessage(request.Version, 
            "http://schemas.xmlsoap.org/ws/2004/09/transfer/CreateResponse",
            resourceCreatedMessage);

Cependant, le problème se pose lors de la définition de différents espaces de noms pour les éléments enfants dans la réponse; il semble que les contrats de données de WCF ne le fassent pas. Même en utilisant

[MessageBodyMember(Namespace="....")]

sur les éléments individuels de la classe de réponse ne semblent pas apporter de modifications, tout devient partie de l'espace de noms spécifié pour la classe de contrat.

Alors, comment appliquer différents espaces de noms à des éléments individuels dans un message WCF? soit via un contrat, ou via un autre pokery jiggery?

Était-ce utile?

La solution 2

Alors, suivez la réponse de Jezell; Le problème lié à l'utilisation de XmlSerialization lors de la création manuelle d'un message est que les éléments enfants de la racine sont mutilés. Cela se produit car, même si le contrat d’opération est marqué comme [XmlSerializerFormat] lorsque vous créez un message à la main, le DataContractSerializer est utilisé.

Vous ne pouvez pas transmettre XmlSerializer à Message.CreateMessage () car il requiert un XmlObjectSerializer, ce que XmlSerializer n'est pas.

Donc, la réponse semble être écrire une classe wrapper pour XmlSerializer, dont la classe de base est XmlObjectSerializer ( voici un exemple ) et transmettez-le; avec votre classe de maintien de message.

Malheureusement, il n'est pas assez intelligent pour installer des préfixes dans le XML; de sorte que vous vous retrouvez avec des messages comme

<ResourceCreated xmlns="http://schemas.xmlsoap.org/ws/2004/09/transfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/">http://localhost:8731/Design_Time_Addresses/AddTests/WSTransfer/</Address>
  <ReferenceType xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/"></ReferenceType>

Mais tout est équivalent.

Autres conseils

Dans un cas comme celui-ci, lorsque vous avez besoin d'un contrôle précis sur la sortie XML, vous devez utiliser le XmlSerializer au lieu de la sérialisation DataContract ou MessageContract. Voici plus d'informations sur la façon de faire cela:

http://msdn.microsoft.com/en-us/library /ms733901.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top