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

11

我有一个MVC 6项目,其中我正在使用Fiddler测试Web API。如果我采取以下控制器操作,使用EntityFramework 7返回List,那么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中添加一些请求和响应的网络数据? - user700390
由于您收到了502错误,这意味着服务器端出现了错误。因此,请调试项目并查看日志。 - poke
1
你可以直接使用 public IEnumerable<Order> 或者 public IEnumerable<object> 替代 public JsonResult 并返回模型。我认为这个链接会回答你所有的问题。 - Oleg
如果我在操作的返回值上设置断点,我可以检查模型。它拥有实体应该有的一切。唯一能注意到的是可能存在循环引用。它获取订单,该订单有一个用户,该用户有一个订单列表,其中包含该用户。似乎这可能会导致混淆。有没有办法阻止它正在进行的递归? - Dblock247
循环引用一直是JSON面临的问题。尝试使用此链接查看循环引用是否有所帮助:https://dev59.com/x3I-5IYBdhLWcg3wI0p9 - Ankit Vijay
显示剩余4条评论
1个回答

21

首先你可以使用 IEnumerable<Order> 或者 IEnumerable<object> 作为返回类型,而不是 JsonResult 并且只返回 orderRepository.GetAll()。我建议你阅读 这篇文章 获取更多信息。

关于另一个错误的“Bad Gateway”,尝试在最新版本8.0.2的依赖项中添加 Newtonsoft.Jsonpackage.json 中并使用它。

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

顺便说一下,如果我在可行代码的返回语句上设置断点,并等待足够长的时间,就可以重现你描述的错误"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
1
@Dblock247:MVC通常不返回XML数据。这些设置是Newtonsoft.Json的特定设置,它是ASP.NET 5中默认的JSON序列化程序。 - Oleg
谢谢您提供的信息。您能推荐一个XML序列化器吗? - Dblock247
@Dblock247:首先,您应该添加“Microsoft.AspNet.Mvc.Formatters.Xml”。然后,您可以使用格式化程序来配置Mvc以使用Xml作为输入或输出格式。您可以尝试自己实现,并在遇到问题时提出新问题 - Oleg
@Dblock247:我看到你从未使用过投票功能。这真的非常重要,它为搜索有用的内容提供了提示。它可以帮助其他访客找到答案或问题。例如请查看这里。你每天有权投票约30次。如果你想帮助他人,就应该积极利用这个权利。 - Oleg
没有在5.0 .Net Api中工作。 - Alexandre Ribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接