Comment personnaliser WCF la sérialisation XML
Nous avons déjà SAVON interface de service web que nous voulons mettre en œuvre à l'aide de la WCF pour une nouvelle application. Cela semble bien fonctionner sauf pour un petit détail. L'espace de noms XML du type de retour d'une fonction doit être différente de l'espace de noms XML du service web lui-même. Et pour la vie de moi, je ne peux pas le faire fonctionner.
J'ai recréé le même problème avec un petit exemple de projet.
La WCF interface:
[XmlSerializerFormat]
[ServiceContract(Namespace = "urn:outer-namespace")]
public interface IService1
{
[OperationContract]
MyClass DoStuff(int value);
}
[Serializable]
public class MyClass
{
[XmlElement(ElementName = "DataString")]
public string MyString { get; set; }
}
Le service web de mise en œuvre:
public class Service1 : IService1
{
public MyClass DoStuff(int value)
{
return new MyClass { MyString = "Wooh!" };
}
}
Une réponse de ce service web est alors sérialisé:
(Sans SAVON)
<DoStuffResponse xmlns="urn:outer-namespace">
<DoStuffResult>
<DataString>Wooh!</DataString>
</DoStuffResult>
</DoStuffResponse>
Mais nous voulons que le <DoStuffResult> pour être xmlns="urn:intérieur de l'espace de noms".
J'ai essayé d'ajouter un [retour: XmlElement(...)] sur l'interface de la fonction ou du service web de la fonction, mais cela ne prend pas. Aussi un [XmlType] ou [XmlRoot] sur la définition de la classe MyClass ne fonctionne pas.
Quelqu'un a une idée de comment modifier le XML sérialisé espace de nom (ou nom de l'élément) de l'objet qui est la valeur de retour d'un service web WCF fonction?
OriginalL'auteur Jeroen-bart Engelen | 2009-03-16
Vous devez vous connecter pour publier un commentaire.
Définissent les espaces de noms avec la Sérialisation XML (ou mieux) Contrat de Données définition des attributs.
par exemple avec de la Sérialisation XML:
par exemple, avec Contrat de Données sérialisation:
MODIFIER
Basé sur le premier commentaire, le ci-dessus ne fonctionne pas, parce que le désir est de définir l'espace de noms sur le SAVON wrapper autour de la message, pas sur le message lui-même.
OperationContractAttribute
offre aucun contrôle sur les espaces de noms, et je ne vois pas d'autre WCF attributs au niveau de la méthode.Deux possibilités: (1) Vous pouvez avoir assez de contrôle par la chute d'un niveau d'abstraction et à l'aide d'un Contrat de Message. (2) Obtenir le courant de WSDL pour le service (à l'aide de
svcutil.exe
), en ajustant manuellement pour obtenir les espaces de noms que vous voulez, et ensuite à l'aide desvcutil.exe
pour générer le code, et de regarder le code résultant.J'ai utilisé svcutil, mais sans spécifier un sérialiseur et il a généré une combinaison de MessageContract et ServiceContract avec XmlSerializer. Donc, il y a un ou deux wrappers, et je pouvais encore utiliser les attributs XML pour les faire fonctionner.
OriginalL'auteur Richard
Après des jours de recherche et d'essayer des dizaines de solutions recommandées; j'ai finalement été en mesure d'obtenir de la WCF pour arrêter de forcer une enveloppe contenant le nom de l'ajout de
Result
pour le nom de la méthode de service web. L'astuce est d'ajouter les éléments suivants décorateur d'attribut à l'interface du service web:Cet attribut doit être placé/situé directement après la
[OperationContract]
attribut (et juste avant la réelle méthode de stub) dans l'interface.(J'ai aussi besoin d'ajouter un
XmlSerializerFormat
attribuer à l'ensemble de laServiceContract
etOperationContract
les attributs).OriginalL'auteur Rich Bayless