Не удается получить ASP.NET MVC 6 Controller, чтобы вернуть JSON

У меня есть проект MVC 6, в котором я использую Fiddler для тестирования Web API. Если я возьму следующее действие контроллера, которое использует EntityFramework 7 для возврата списка. Тогда 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 правильно?

Ответ 1

Прежде всего, вы можете использовать IEnumerable<Order> или IEnumerable<object> как возвращаемый тип вместо JsonResult и вернуть только orderRepository.GetAll(). Я рекомендую вам прочитать статью от дополнительной информации.

О другой ошибке с Bad Gateway. Попытайтесь добавить Newtonsoft.Json в последней версии 8.0.2 к зависимостям в package.json и использовать use

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

Кстати, можно воспроизвести ошибку "HTTP Error 502.3 - Bad Gateway", которую вы описываете, если я просто установил точку останова на оператор возврата рабочего кода и подожду достаточно долго. Таким образом, вы увидите сообщение об ошибке "HTTP Error 502.3 - Bad Gateway" очень скоро во многих распространенных ошибках.

Вы можете рассмотреть более полезные варианты сериализации. Например

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;
    });