2009-07-13 15 views
1

Ich habe ein folgendes Problem. Ein Kunde aufgefordert, einen Web-Dienst, die Daten in folgendem Format zurück:Benutzerdefinierter Datenvertrag/Name des Datenmembers

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

Aber wenn ein Fehler auftritt sie eine Meldung erhalten mag:

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

Ich habe einen Web-Service mit WCF und um die Anforderungen zu erfüllen I definiert einen folgenden Servicevertrag:

 

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

und definiert auch eine folgende Basisklasse:

 

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

    } 
 

Und zwei schließt man Klassen:

 

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

Und:

 

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

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

     } 
    } 
 

Das Problem ist, dass, wenn ich die Daten aus dem Web-Service die Datenvertragsnamen ("status") ziehen und Die Namen der Datenelemente werden ignoriert, und die Namen der Typen und Eigenschaften werden verwendet.

Ist es möglich, die custome-Namen zu verwenden?

+0

Bitte bearbeiten Sie die Frage, um genau zu zeigen, wie das XML jetzt aussieht. –

Antwort

8

Sie sollten sowohl UniLoginNotFoundError als auch PatronStatusData mit DataContract (Name = "Something") dekorieren, damit dies funktioniert. Aber Sie dürfen nicht denselben Namen ("Status") für sie festlegen. In Ihrem speziellen Fall verwende ich besser eine einzelne Klasse mit nicht verwendeten Eigenschaften, die auf null gesetzt sind.

[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, das ist der Weg zu gehen. Wenn Sie besonders deutlich sein möchten, können Sie auch ein "IsRequired = false" zu den DataMember-Attributen hinzufügen, um klarzustellen, dass keiner der beiden Strings tatsächlich benötigt wird. –

0

Im Allgemeinen ist es ein Fehler, zu viel Kontrolle über das XML zu haben, das durch das Serialisieren eines Datenvertrags generiert wird. Das ist die Falle des XML-Serialisierers. Definieren Sie den Vertrag allgemein und lassen Sie die Kunden das Ergebnis konsumieren, was in der Regel einfach genug ist.

Verwandte Themen