ASP.NET MVC 2.0 JsonRequestBehavior全局设置

默认情况下,ASP.NET MVC 2.0现在将在操作尝试返回JSON以响应GET请求时引发exception。 我知道这可以通过使用JsonRequestBehavior.AllowGet方法的方法重写,但是可以设置一个控制器或更高的基础上(可能是web.config)?

更新:每Levi的评论,这是我最终使用 –

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding) { return Json(data, contentType, JsonRequestBehavior.AllowGet); } 

这与其他MVC特定的设置一样,不能通过Web.config进行设置。 但是你有两个select:

  1. 覆盖Controller.Json(object,string,Encoding)重载来调用Json(object,string,Encoding,JsonRequestBehavior),传递JsonRequestBehavior.AllowGet作为最后一个参数。 如果您希望将其应用于所有控制器,则在抽象基本控制器类中执行此操作,然后让所有控制器inheritance该抽象类。

  2. 创build一个扩展方法MyJson(this Controller,…),它创build一个JsonResult并设置适当的属性,然后通过this.MyJson(…)从你的控制器调用它。

还有另外一个select。 使用动作filter。

创build一个新的ActionFilterAttribute,将其应用到您的控制器或特定的操作(取决于您的需要)。 这应该足够了:

 public class JsonRequestBehaviorAttribute : ActionFilterAttribute { private JsonRequestBehavior Behavior { get; set; } public JsonRequestBehaviorAttribute() { Behavior = JsonRequestBehavior.AllowGet; } public override void OnResultExecuting(ResultExecutingContext filterContext) { var result = filterContext.Result as JsonResult; if (result != null) { result.JsonRequestBehavior = Behavior; } } } 

然后像这样应用它:

 [JsonRequestBehavior] public class Upload2Controller : Controller 

由于安全原因,MVC 2阻止了Json的GET请求。 如果你想覆盖这个行为,请检查接受JsonRequestBehavior参数的Json的重载。

 public ActionResult Index() { return Json(data, JsonRequestBehavior.AllowGet) } 

当我第一次在MVC 1.0中使用我的旧代码使用MVC 2.0时,我也遇到了这个错误。 我用小提琴来确定错误的原因。 请参阅如何使用Fidder排除故障的步骤 –

http://www.rodcerrada.com/post/2011/07/11/jQuery-getJSON()-does-not-tirgger-the-callback-in-ASPNET-MVC-2.aspx

这是MVC2试图解决的安全问题吗? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

如果是这样,这个漏洞似乎只是一个问题,如果你试图做一个外部网站的JSON调用。 如果你的MVC2应用程序只对你自己的网站进行json调用(例如填充jqgrids),那么你是否可以安全地覆盖基本控制器中的Json调用来始终允许获取?

只需从以下位置更改JSON代码:

 $.getJson("methodname/" + ID, null, function (data, textStatus) 

至:

 $.post("methodname/" + ID, null, function (data, textStatus)