无法让 ASP.NET MVC 6 控制器返回 JSON

Posted

技术标签:

【中文标题】无法让 ASP.NET MVC 6 控制器返回 JSON【英文标题】:Cant get ASP.NET MVC 6 Controller to return JSON 【发布时间】:2016-01-16 21:36:13 【问题描述】:

我有一个 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 的任何想法?

【问题讨论】:

能否添加一些来自 Fiddler 的请求和响应的网络数据? 由于收到 502,服务器端出现错误。所以调试项目并查看日志。 它说 502 Bad Gateway HTTP/1.1 502 Bad Gateway Cache-Control: private Content-Type: text/html; charset = utf-8服务器:kestrel x-sourcefiles:=?utf-8?b?wjpcrg9jdw1lbnrzxfzpc3vhbcbtdhvkaw8gmjaxnvxqcm9qzwn0c1xkzw5tb2xvxhnyy1xkzw5tb2xvxhd3d3jvb3q =?x-powered-by:asp.net日期:asp.net日期:sat,2016年1月16日23:16:58 GMT内容长度:第4939章 您可以只使用public IEnumerable<Order>public IEnumerable<object> 而不是public JsonResult 并返回模型。我认为the link 会回答你所有的问题。 @Oleg 我已经尝试过 IEnumberable,但仍然没有运气。我确实注意到在提琴手中的内容类型是 text/html。会不会是这个原因。 ObjectResult 不应该将内容类型更改为 json 吗? 【参考方案1】:

首先,您可以使用IEnumerable<Order>IEnumerable<object> 作为返回类型而不是JsonResult,并且只返回orderRepository.GetAll()。我建议您阅读the article fr 的其他信息。

关于 Bad Gateway 的另一个错误。尝试将最新版本 8.0.2 中的 Newtonsoft.Json 添加到 package.json 中的依赖项中并使用使用

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

【讨论】:

谢谢你的作品。 xml 也有选项吗? @Dblock247:MVC 通常不返回 XML 数据。这些设置是 Newtonsoft.Json 的特定设置,它是 ASP.NET 5 中默认的 JSON 序列化程序。 感谢您提供的信息。你能推荐一个 XML 序列化器吗? @Dblock247:首先你应该添加"Microsoft.AspNet.Mvc.Formatters.Xml"。然后你就有了可以用来配置 Mvc 以使用 Xml 作为输入或输出格式的格式化程序。您可以尝试自己实施,如果遇到问题,请提出新问题 @Dblock247:我看到你以前从未使用过投票。这真的很重要,它允许提供搜索内容有用的提示。它可以帮助其他访问者找到答案/问题。例如,请参阅here。您每天有权投票大约 30 个答案。如果您需要其他帮助,您应该主动使用权利。

以上是关于无法让 ASP.NET MVC 6 控制器返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NEt MVC 使用 Web API 返回 Razor 视图

在 ASP.NET MVC 控制器中,如何让 Redirect(string URL) 方法不附加“#”?

ASP.Net MVC 4. 在单独的程序集中路由控制器返回错误 404

无法更改 ASP.NET MVC 3 中文本框的值

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

ASP.NET MVC 和 WCF