1

次の問題があります。顧客が、次の形式でデータを返すWebサービスを要求しました。

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

ただし、エラーが発生すると、次のメッセージが表示されます。

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

WCFを使用してWebサービスを作成し、要件を満たすために、次のサービス契約を定義しました。


    [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つの派生クラス:


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

と:


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

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

        }
    }

問題は、Webサービスからデータをプルするときに、データコントラクト名(「ステータス」)とデータメンバーの名前が無視され、タイプとプロパティの名前が使用されることです。

顧客名を使用することは可能ですか?

4

2 に答える 2

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 ;}
    }
...
}
于 2009-07-13T11:20:39.710 に答える
0

一般的に言って、データ コントラクトをシリアル化することによって生成される XML を過度に制御するのは誤りです。これが XML シリアライザーの落とし穴です。一般的な条件でコントラクトを定義し、クライアントに結果を消費させるだけです。これは通常、十分に単純です。

于 2009-07-13T20:13:16.377 に答える