将.NET MVC模型作为JSON返回导致Bad Gateway

时间:2016-07-26 12:43:17

标签: c# .net json asp.net-mvc entity-framework

我已经从.NET Web应用程序模板创建了一个Web应用程序。这个应用程序应该显示英雄和他们的超级大国。

这是我的控制器方法:

public IActionResult GetHero(int id)
    {
        if (!ModelState.IsValid)
        {
            return HttpBadRequest(ModelState);
        }

        Hero hero = _context.Hero.Include(m => m.SuperPowers).Single(m => m.Id == id);

        if (hero == null)
        {
            return HttpNotFound();
        }

        return Json(hero);
    }

这是我的模型

public class Hero
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<SuperPower> SuperPowers { get; set; }
}

如果我使用

return Json(hero);

就像上面的控制器代码一样,我得到了一个&#34; Bad Gateway&#34;错误,但如果我使用

return View(hero);

我可以在我创建的视图中显示英雄和相关的超级大国。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

尝试:

return Json(hero, JsonRequestBehavior.AllowGet);

请参阅this answer了解其重要性的原因。 GET请求默认拒绝:

  

默认情况下,ASP.NET MVC框架不允许您使用JSON有效内容响应HTTP GET请求。如果您需要发送JSON以响应GET,则需要使用JsonRequestBehavior.AllowGet作为Json方法的第二个参数来显式允许该行为。但是,恶意用户有可能通过称为JSON Hijacking的进程获得对JSON有效负载的访问权限。您不希望在GET请求中使用JSON返回敏感信息。有关详细信息,请参阅Phil http://haacked.com/archive/2009/06/24/json-hijacking.aspx/的帖子。

答案 1 :(得分:1)

你试过这个:

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