2009-07-13 8 views
1

私は次の問題があります。顧客は、次の形式でデータを返すWebサービス要求:カスタムdatacontract/datamemberの名前

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

しかしをエラーでは、次のメッセージを取得したいが発生した場合:私は、WCFと順番にを使用してWebサービスを作成し

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

要件を満たすために、私は、次のサービス契約に定義:

 

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

をし、また、以下の基本クラスを定義した:

 

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

    } 
 

そして2つのderrivedクラス:

 

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

そして:問題は、私は、Webサービスのデータコントラクト名( "状態")からデータを取得するときということです

 

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

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

     } 
    } 
 

とデータメンバの名前は無視され、型とプロパティの名前が使用されます。

カストム名を使用することはできますか?

+0

質問を編集して、XMLの外観を正確に表示してください。 –

答えて

8

この作業を行うには、UniLoginNotFoundErrorとPatronStatusDataの両方をDataContract(Name = "Something")で飾る必要があります。しかし、あなたは同じ名前(「ステータス」)を設定することはできません。 具体的には、未使用のプロパティがnullに設定された単一クラスを使用することをお勧めします。

[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うん、それは行く方法です。余計なことが必要な場合は、DataMember属性に「IsRequired = false」を追加して、2つの文字列のどちらも実際に必要でないことを明瞭にすることができます。 –

0

一般的に言えば、データ契約のシリアル化によって生成されたXMLを管理するのは間違いです。これがXMLシリアライザの罠です。一般的な条件で契約を定義し、クライアントが結果を消費するようにします。これは一般に十分単純です。

関連する問題