2010-06-26 2 views
1

J'ai un service WCF qui utilise un contrat de message pour la requête et des réponses de données. Ce est le contrat de service:Sérialisation XML Problème lors de l'utilisation de WCF

[ServiceContract()] 
public interface ISalesFinderService 
{ 
    [OperationContract()] 
    Response DoSomething(Request i_Info); 
} 

Le problème se produit lorsque renvoie une réponse au service. Voici le message de réponse:

[MessageContract()] 
public class ObjectInfo 
{ 
    [MessageBodyMember(Name = "Name")] 
    public string m_Name; 
} 

[MessageContract()] 
public class Response 
{ 
    private List<ObjectInfo> m_MyListOfObjects; 

    public FindSalesByLocationInfoMessageResponse() 
    { 
     m_MyListOfObjects = new List<ObjectInfo>(); 
    } 

    [MessageBodyMember(Name = "ObjectsInfo")] 
    public List<ObjectInfo> MyListOfObjects 
    { 
      get { return m_MyListOfObjects; } 
      set { m_MyListOfObjects = value; } 
    } 
} 

Lorsque la réponse sort je peux voir (par Wireshark) que tous les champs à l'intérieur de la liste (de type ObjectInfo) ont été sérialisés en XML et ont l'étiquette <a:m_Name></a:m_Name> bien que j'ajouté spécifiquement l'attribut MessageBodyMember au-dessus du membre de données m_Name et lui a donné "Name" comme son tag.

Comment puis-je modifier ces noms de balises comme je le souhaite ???

merci ..

Répondre

1

Je pense que vous êtes mal compris la raison du contrat de message et comment l'utiliser. Consultez la documentation MSDN sur Using Message Contracts pour une discussion plus approfondie.

Le contrat de message vous permet de définir une disposition de votre message avec en-tête (s) et éléments de corps. Ceux-ci peuvent être des types atomiques comme string ou int, et sinon, vous devez définir des types composites en tant que classes.

Les parties composites (classes) que vous utilisez dans ce contrat de message doivent être marquées [DataContract] avec les attributs [DataMember] sur les champs individuels que vous souhaitez sérialiser. En outre, vos contrats de contrat et de données de message ne doivent jamais contenir de fonctions et tout ce qui doit être exécuté. Les structures de données seront sérialisées en tant que données seulement, tout comportement sera perdu dans le transfert.

Donc, dans votre cas, vous devriez essayer:

[MessageContract()] 
public class Response 
{ 
    private List<ObjectInfo> m_MyListOfObjects = new List<ObjectInfo>(); 

    [MessageBodyMember(Name = "ObjectsInfo")] 
    public List<ObjectInfo> MyListOfObjects 
    { 
     get { return m_MyListOfObjects; } 
     set { m_MyListOfObjects = value; } 
    } 
} 

[DataContract] 
public class ObjectInfo 
{ 
    [DataMember(Name = "Name")] 
    public string m_Name; 
} 
+0

Merci beaucoup, vous avez résolu la question du nom, mais chaque membre dans la liste est toujours le « un » préfixe je peux voir que à travers le journal des messages (svcTraceviewer - niveau d'information trace), comment puis-je me débarrasser de ce "a" préfixe ?? merci. – Liran

+0

Ce préfixe "a:" doit faire partie d'un espace de noms XML quelconque. Voyez si vous trouvez une définition d'espace de noms XML quelque part dans votre message XML - quelque chose comme 'xmlns: a = .......'. Mais pourquoi cela vous dérange? Ça ne devrait vraiment pas être un problème, je pense ... –