2009-11-02 81 views
38

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

更新:每利的评论,这是我结束了using-

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

这里的安全问题证明了很好的解释默认获取限制:http://haacked.com/archive/2009/06/25/json-hijacking。aspx – 2010-05-15 06:12:49

+0

阅读这个解释,似乎有一种绕过这个问题的简单方法,而不诉诸于这种处理它的非RESTful方式。 – 2012-03-29 10:11:26

回答

26

这,像其他MVC特定的设置,是不是通过Web.config中设置的。但是,你有两个选择:

  1. 覆盖的Controller.Json(对象,字符串编码)重载调用JSON(对象,字符串编码,JsonRequestBehavior),通过JsonRequestBehavior.AllowGet作为最后一个参数。如果您希望将其应用于所有控制器,请在抽象基本控制器类中执行此操作,然后让所有控制器继承该抽象类。

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

4

出于安全原因,MVC 2阻止JSON的GET请求。如果您想覆盖该行为,请检查接受JsonRequestBehavior参数的Json的重载。

public ActionResult Index() 

{ 

    return Json(data, JsonRequestBehavior.AllowGet) 

} 
+9

这不是一个答案,这只是重述了这个问题。 – 2011-01-01 14:52:08

0

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

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

+0

您链接的博文是正确的。但是,如果用户必须进行身份验证,该漏洞总是一个问题。 – ReinierDG 2011-02-22 07:51:44

21

还有另一种选择。使用动作过滤器。

创建一个新的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 
+2

如果您希望它适用于任何地方,可以在MVC 3及更高版本中使用全局动作过滤器。 – 2012-03-28 08:04:18

0

只要改变JSON代码:

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

到:

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