2009-07-13 17 views
1

J'ai un problème suivant. Un client a demandé un service Web qui renvoie les données au format suivant:Nom du fournisseur de données/nom de l'utilisateur personnalisé

<status> 
<name1>Some name</name1> 
... 
</status> 

Mais quand une erreur se produit, ils veulent obtenir un message suivant:

<status> 
<error>Error description</error> 
</status> 

J'ai créé un service Web en utilisant WCF et pour pour répondre aux exigences je définissais un contrat de service suivant:

 

    [ServiceContract] 
    public interface IPatronStatus 
    { 
     [OperationContract] 
     [ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))] 
     [WebGet(UriTemplate = "/service/status?user={unilogin}")] 
     StatusData GetPatronStatus(string unilogin); 
    } 
 

Et aussi défini une classe de base suivante:

 

    [DataContract(Name="status")] 
    public class StatusData 
    { 

    } 
 

Et deux classes derrived:

 

public class PatronStatusData : StatusData 
{ 
     private string _name; 
     [DataMember(Name = "name1", Order = 0)] 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
... 
} 
 

Et:

 

public class UniLoginNotFoundError : StatusData 
    { 
     public UniLoginNotFoundError() 
     { } 

     private string _description = "UniLoginNotFoundError"; 
     [DataMember(Name = "error", Order = 0)] 
     public string Description 
     { 
      get 
      { 
       return _description; 
      } 

     } 
    } 
 

Le problème est que quand je tire les données du service Web le nom de contrat de données ("statut") et les noms des membres de données sont ignorés et les noms des types et des propriétés sont utilisés.

Est-il possible d'utiliser les noms custome?

+0

Veuillez éditer la question pour montrer exactement à quoi ressemble le XML maintenant. –

Répondre

8

Vous devez décorer UniLoginNotFoundError et PatronStatusData avec DataContract (Name = "Something") pour que cela fonctionne. Mais vous ne serez pas autorisé à définir le même nom ("statut") pour eux. Dans votre cas particulier, je ferais mieux d'utiliser une seule classe avec des propriétés inutilisées à zéro.

[DataContract(Name="status")] 
public class StatusData 
{ 
    private string _name; 
    private string _errorDescription = null; 


    [DataMember(Name = "name1", Order = 0, EmitDefaultValue=false)] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 


    [DataMember(Name = "error", Order = 1, EmitDefaultValue=false)] 
    public string Description 
    { 
     get{ return _errorDescription ;} 
     set {_errorDescription =value ;} 
    } 
... 
} 
+1

+1 yup, c'est la voie à suivre. Si vous voulez être extra clair, vous pouvez également ajouter un "IsRequired = false" aux attributs DataMember, pour qu'il soit clair qu'aucune des deux chaînes n'est vraiment requise. –

0

De manière générale, c'est une erreur que de vouloir trop contrôler le XML généré en sérialisant un contrat de données. C'est le piège du XML Serializer. Définissez le contrat en termes généraux, et demandez aux clients de consommer le résultat, qui sera généralement assez simple.