2009-11-02 35 views
38

ASP.NET MVC 2.0 bây giờ, theo mặc định, ném một ngoại lệ khi một hành động cố gắng trả về JSON theo yêu cầu GET. Tôi biết điều này có thể được ghi đè trên một phương pháp theo phương pháp cơ sở bằng cách sử dụng JsonRequestBehavior.AllowGet, nhưng là nó có thể đặt trên một bộ điều khiển hoặc cơ sở cao hơn (có thể là web.config)?ASP.NET MVC 2.0 JsonRequestBehavior Global Setting

Cập nhật: mỗi bình luận Levi, đây là những gì tôi đã kết thúc using-

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

Dưới đây là một lời giải thích tốt cho những mối quan tâm an ninh biện minh giới hạn nhận mặc định: http://haacked.com/archive/2009/06/25/json-hijacking.aspx –

+0

Đọc lời giải thích đó, có vẻ là một cách nhỏ nhặt để phá vỡ vấn đề mà không phải dùng đến cách giải quyết vấn đề này. –

Trả lời

26

này, giống như các thiết lập MVC-cụ thể khác, không phải là settable qua Web.config. Nhưng bạn có hai lựa chọn:

  1. Override các Controller.Json (object, chuỗi, Encoding) quá tải để gọi Json (object, chuỗi, Encoding, JsonRequestBehavior), đi qua JsonRequestBehavior.AllowGet như là đối số cuối cùng. Nếu bạn muốn điều này áp dụng cho tất cả các bộ điều khiển, thì hãy làm điều này bên trong một lớp điều khiển cơ sở trừu tượng, sau đó có tất cả các lớp con của bộ điều khiển của bạn mà lớp trừu tượng.

  2. Tạo phương thức mở rộng MyJson (Bộ điều khiển này, ...) tạo một JsonResult và đặt các thuộc tính thích hợp, sau đó gọi nó từ bộ điều khiển của bạn thông qua this.MyJson (...).

4

MVC 2 chặn Json cho yêu cầu GET vì lý do bảo mật. Nếu bạn muốn ghi đè hành vi đó, hãy kiểm tra quá tải cho Json chấp nhận tham số JsonRequestBehavior.

public ActionResult Index() 

{ 

    return Json(data, JsonRequestBehavior.AllowGet) 

} 
+9

Đó không phải là câu trả lời, đó chỉ là câu trả lời cho câu hỏi. –

0

Đây có phải là vấn đề bảo mật mà MVC2 đang cố giải quyết không? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Nếu có, có vẻ như lỗ hổng chỉ là vấn đề nếu bạn đang cố thực hiện cuộc gọi json tới trang web bên ngoài. Nếu ứng dụng MVC2 của bạn chỉ thực hiện các cuộc gọi json tới trang web của riêng bạn (ví dụ để điền jqgrids), bạn không thể ghi đè cuộc gọi Json trong bộ điều khiển cơ sở của mình để luôn nhận được?

+0

Bài đăng trên blog bạn đã liên kết là chính xác. Nhưng lỗ hổng luôn là vấn đề nếu người dùng phải xác thực. – ReinierDG

21

Có một tùy chọn khác. Sử dụng Bộ lọc hành động.

Tạo một ActionFilterAttribute mới, áp dụng nó cho bộ điều khiển của bạn hoặc một hành động cụ thể (tùy theo nhu cầu của bạn). Điều này nên là đủ:

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

Sau đó áp dụng nó như thế này:

[JsonRequestBehavior] 
public class Upload2Controller : Controller 
+2

Có thể sử dụng Bộ lọc hành động toàn cầu trong MVC 3 trở lên nếu bạn muốn áp dụng điều này ở mọi nơi. –

0

Chỉ cần thay đổi mã JSON từ:

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

tới:

$.post("methodname/" + ID, null, function (data, textStatus) 
Các vấn đề liên quan