2009-11-02 85 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)