6

API メソッドを標準 MVC アクションから新しい asp.net Web-API ベータ版に移行したところ、突然、読み取り専用プロパティがシリアル化されなくなりました (どちらも JSON を返します)。これは予想される動作ですか?

編集:コードサンプルを追加

nuget パッケージを介して Newtonsoft.Json 4.0.8 と System.Json 4.0 の両方を参照しています

        public IQueryable<Car> Gets()
        {
             return _carRepository.GetCars();
        }

        public class Car
        {
            public IEnumerable<Photo> Photos
            {
                get { return _photos; }
            }

            public string PreviewImageUrl // No longer serialized
            {
                get
                {
                     var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault();
                        return mainImage != null ? mainImage.Url : (string.Empty);
                    }
                }
             }
         }
4

2 に答える 2

10

ベータ版に同JsonMediaTypeFormatter梱されているは、読み取り専用プロパティをサポートしていないシリアライザーを使用しています(正しくラウンドトリップしないため)。次の現実のためにこれに対処することを計画しています。

MediaTypeFormatterそれまでの間、組み込みのフォーマッターの代わりにJson.NET(ここで利用できるものがあります)を使用するカスタムJSON実装を使用できます。

更新: JSON.NETフォーマッターの接続に関するHenrikのブログもチェックしてください:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net- web-api.aspx

于 2012-02-23T00:47:01.370 に答える
4

これが予期された動作であるかどうかはわかりません。これは、入力パラメーターには予想されることですが (値を設定できないため)、出力パラメーターには当てはまりません。したがって、これは出力パラメーターのバグだと思います。この問題を示す例を次に示します。

モデル:

public class Product
{
    public Product()
    {
        Prop1 = "prop1 value";
        Prop2 = "prop2 value";
        Prop3 = "prop3 value";
    }

    public string Prop1 { get; set; }

    [ReadOnly(true)]
    public string Prop2 { get; set; }

    public string Prop3 { get; protected set; }
}

コントローラ:

public class ProductsController : ApiController
{
    public Product Get(int id)
    {
        return new Product();
    }
}

リクエスト:

api/products/5

結果:

{"Prop1":"prop1 value","Prop2":"prop2 value"}

したがって、プロパティにパブリック セッターがないProduct場合、この場合はクラスが出力として使用されるため、シリアル化されません。これは正常ではないようです。

Microsoft がリリース前にこれを修正できるように、または少なくともこれが設計によるものであることを伝えられるように、コネクト チケットを開くことをお勧めします。

于 2012-02-21T22:37:05.993 に答える