web-dev-qa-db-ja.com

ASP.NET MVC6コントローラーを取得してJSONを返すことはできません

Fiddlerを使用してWebAPIをテストしているMVC6プロジェクトがあります。 EntityFramework7を使用してリストを返す次のコントローラーアクションを実行した場合。その後、htmlは正常にレンダリングされます。

[HttpGet("/")]
public IActionResult Index()
{
    var model = orderRepository.GetAll();

    return View(model);
}

しかし、代わりにJson応答を返そうとすると、502エラーが発生します。

[HttpGet("/")]
public JsonResult Index()
{
    var model = orderRepository.GetAll();

    return Json(model);
}

オブジェクトがjsonに正しくシリアル化されない理由についてのアイデアはありますか?

11
Dblock247

まず、戻り値の型としてJsonResultの代わりに_IEnumerable<Order>_または_IEnumerable<object>_を使用し、orderRepository.GetAll()だけを返すことができます。 記事 fr追加情報を読むことをお勧めします。

BadGatewayの別のエラーについて。最新バージョン8.0.2の_Newtonsoft.Json_を_package.json_の依存関係に追加し、使用してみてください

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

ちなみに、「HTTPエラー502.3-不正なゲートウェイ」というエラーを再現できます。これは、作業コードのreturnステートメントにブレークポイントを設定して、十分長く待つと説明します。したがって、多くの一般的なエラーですぐに「HTTPエラー502.3-不正なゲートウェイ」というエラーが表示されます。

より役立つシリアル化オプションを検討してください。例えば

_services.AddMvc()
    .AddJsonOptions(options => {
        // handle loops correctly
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;

        // use standard name conversion of properties
        options.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver();

        // include $id property in the output
        options.SerializerSettings.PreserveReferencesHandling =
            PreserveReferencesHandling.Objects;
    });
_
21
Oleg