2

クライアントが XML 形式でデータを返すように要求できる Web API を作成しています。Enterprise Foundation と MVC4 を使用して、これを .NET に実装しています。

コントローラーのモデルから一部のフィールドのサブセットのみを返す方法に少し苦労しています。

議論のために、属性「Id」、「Name」、「Price」、および「Actual Cost」を含む Product モデルがあるとします ( http://www.asp.net/web-apiの例を使用しています)。 /overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-6 )

クライアントが特定の製品をクエリしてその名前と価格を取得するための Web API を公開する必要がありますが、この応答では "実際のコスト" プロパティを返したくありません (これは私たちの秘密であるため)。

今私が提供するリンクでは、これはまさに彼らが DTO を使用して解決しようとしている問題です (彼らは、私が返したいサブセットのみを含む ProductDTO と呼ばれる DTO を定義しています)。このソリューションを実装したところ、DTO で指定したフィールドのみを返すことができるようになりました。

問題は、XML で返されるエンティティに使用される命名が、Product ではなく ProductDTO になっていることです。つまり、返される XML は

{"ProductDTO":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}

それよりも

{"Product":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}

これは、現在 API を使用しており、「製品」が返されることを期待しているすべてのクライアントが「ProductDTO」を返すことを意味します。これは、コードを変更する必要があり、受け入れられないことを意味します。現在取得している関連するサブフィールドのセットのみを含む「製品」を提供する必要があります。どうすればこれを達成できますか? プロパティが Web API でシリアル化されるのを防ぐで提案されているように、データ メンバーを単純に「無視」することはできません。

背景: Ruby on Rails で記述された既存の API サーバー インターフェイスがあり、現在これを C# および .NET MVC4 に移行しています。また、既存の古い Ruby on Rails API サーバーに既にインターフェイスしている多数のクライアント アプリケーションがあり、クライアントがコードを変更することを望んでいません。API サーバー コードを Ruby on Rails から C# に移行しているだけです。Ruby on Rails では、特定の呼び出しで属性のサブセットのみを返す必要がある場合に、XML シリアライザーにフィルターを適用するだけで済みました。

4

2 に答える 2

0

次のようなクラスがあるとします

public class product
{
public string Name{get; set;}
..
}

応答に表示したくない場合は、[XMLIgnore]属性を使用するだけです

[XMLIgnore]
public string Name{get; set;}

これが役立つことを願っています。

于 2013-09-20T10:09:33.593 に答える
0

開始した DTO ルートを続行する場合は、内部クラスをエクスポート固有のもので汚染することなく、エクスポートするものを制御できるため、これは良い考えです。DataContract 属性を ProductDTO クラスに追加できます。

[DataContract(Name="Product")]
public class ProductDTO
{
    [DataMember]
    public int Id {get;set;}
    [DataMember]
    public string Name {get;set;}
}

Web API で使用される既定の XML フォーマッタは、DataContractSerializer です。詳細については、こちらをご覧ください。

于 2013-09-20T10:16:25.017 に答える