10

У меня есть проект MVC 6, в котором я использую Fiddler для тестирования Web API. Если я возьму следующее действие контроллера, которое использует EntityFramework 7 для возврата списка. Тогда html выдаст штраф.Не удается получить ASP.NET MVC 6 Controller для возврата JSON

[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 правильно?

+0

Можете ли вы добавить некоторые сетевые данные запроса и ответа от Fiddler? – user700390

+0

Поскольку вы получаете 502, на стороне сервера есть ошибка. Поэтому отлаживайте проект и смотрите журналы. – poke

+0

Он говорит, что 502 Bad Gateway HTTP/1.1 502 Bad Gateway Cache-Control: private Content-Type: text/html; кодировка = UTF-8 Сервер: Kestrel X-исходников,: = UTF-8 В WjpcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxNVxQcm9qZWN0c1xKZW5Tb2xvXHNyY1xKZW5Tb2xvXHd3d3Jvb3Q = X-Powered-By:?? ASP.NET Дата: Сб, 16 января 2016 23:16:58 GMT Content-Length: 4939 @poke – Dblock247

ответ

20

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

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

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

Кстати можно воспроизвести ошибку «Ошибка HTTP 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; 
    }); 
+0

Спасибо, что это работает. Есть ли варианты для xml? – Dblock247

+1

@ Dblock247: MVC не возвращает обычно данные XML. Настройки - это конкретные настройки 'Newtonsoft.Json', который по умолчанию является JSON-сериализатором в ASP.NET 5. – Oleg

+0

Благодарим за информацию. Можете ли вы порекомендовать XML-сериализатор? – Dblock247

Смежные вопросы