2016-07-26 74 views
0

我已经从.NET Web应用程序模板创建了一个Web应用程序。这个应用程序应该显示英雄和他们的超级大国。将.NET MVC模型返回为JSON导致Bad Gateway

这是我控制器方法:

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

像上面我收到了一个“Bad Gatewa” y“的错误,但如果我使用

return View(hero); 

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

我在做什么错?

+0

尝试删除您的断点(http://stackoverflow.com/questions/34420397/handling-json-circular-reference-exception-in-asp-net- 5) – Tonio

+0

有些话题,但'英雄'类不被视为'模型',而是作为一个数据结构 – dios231

+0

如果你的行为不是:'public JsonResult GetHero(int id)'? – pookie

回答

2

尝试:

return Json(hero, JsonRequestBehavior.AllowGet); 

this answer为什么这很重要。 GET默认情况下请求被拒绝:

默认情况下,ASP.NET MVC框架不允许您响应具有JSON负载的HTTP GET请求。如果您需要发送JSON以响应GET,则需要使用JsonRequestBehavior.AllowGet作为Json方法的第二个参数来显式允许该行为。但是,恶意用户有机会通过称为JSON劫持的过程访问JSON有效负载。您不希望在GET请求中使用JSON返回敏感信息。欲了解更多详情,请参阅菲尔的帖子http://haacked.com/archive/2009/06/24/json-hijacking.aspx/

+0

只是'JSON''返回JsonResult(英雄,JsonRequestBehavior.AllowGet);'? – Tonio

+0

我得到“不能解析符号JsonRequestBehavior”,但是这也不起作用:return Ok(hero); –

+0

@KarlEriksson它是'System.Web.Mvc'命名空间的一部分,所以它应该解决:https://msdn.microsoft.com/en-us/library/system.web.mvc.jsonrequestbehavior(v=vs.118)的.aspx – ediblecode

1

你有没有尝试过这样的:

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