Web Api(MVC 6)チャンクボディが0サイズのチャンクで正しく終了しなかった

asp.net-core-mvc asp.net-mvc asp.net-web-api c# entity-framework-core

質問

私はMVC 6 rc1とEF 7 rc 1コードファーストモデルを使用してウェブAPIコントローラ上のデータを検索しています。私は以下のような3つのテーブルを持っています。

class Product
{
    public int Id { get; set; }
    public string SomeProperty { get; set; }
    public virtual ICollection<Categorization> Categorizations { get; set; }
    public DateTime SomeProperty2 { get; set; }
    public string SomeProperty3 { get; set; }
    public string SomeProperty4 { get; set; }

}

// NOTE: Entity key should be (ProductId, CategoryId)
class Categorization
{
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

class Category
{
    public int Id { get; set; }
    public ICollection<Categorization> Categorizations { get; set; }
}

私のコントローラ:

[ActionName("searchProducts")]
        public IEnumerable<Product> searchProducts(string searchText,int? id)
        {
          var ret= db.Products
                .Include(s => s.Categorizations).Take(2).ToList();
          return ret;
        }

以下は私のStartup.cs ConfigureServicesセクションです。

          services.AddMvc()
                .AddJsonOptions(options=>
                {
                    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                    options.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
                });
            services.AddCors();

            var connectionString = Configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;

            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ContractsContext>(options => options.UseSqlServer(connectionString));


            services.AddSingleton(_ => Configuration);
            services.AddSingleton<IContractRepository, ContractRepository>();

私がAPIを呼び出すと、Fiddlerの "チャンクボディは0サイズのチャンクで正しく終了しませんでした"というエラーが表示されます。フィドラーの結果セットでは、カテゴリ化が完了し、それ以降のプロパティと残りのオブジェクト(不完全なJSONデータ)まで、プロパティを持つ期待結果セットの最初のオブジェクトのみが表示されます。結果セットに分類を含まない場合、それは完璧に機能します。何か不足していますか?注:EFはデータを正しく返していますが、APIコールでチャンクされており、クライアントはデータを完全に読み取ることができません。

人気のある回答

問題が見つかりました。タイプ 'Product'のプロパティ 'Product'に対して自己参照ループが検出されました。パス '[0]。分類[0]'。

したがって、EFは、ProductオブジェクトのCategorizationコレクションとCategorizationのProductオブジェクトの両方を埋め込みます。ですから、jsonにシリアライズしている間、次のような無限ループになりました。

Product> Categorizations(各カテゴリ - 製品>カテゴリ(各カテゴリ - 製品>カテゴリ(各カテゴリ - 製品>カテゴリ

解決方法:Startup.cs ConfigureServicesセクションを次のように変更します。

services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                });


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ