2014-06-20 15 views
5

Bằng văn bản this answer, tôi được hỏi có bảo đảm về hành vi của ActionFilterAttribute hay không. và tôi không thể trả lời tự tin.Có phải tất cả các giai đoạn của một ActionFilterAttribute được bảo đảm được gọi?

Đặc biệt, là tất cả bốn phương pháp OnActionExecuted, OnActionExecuting, OnResultExecuted & OnResultExecuting đảm bảo để được gọi cho tất cả các yêu cầu mà đi qua các thuộc tính, hay có những trường hợp (như trường hợp ngoại lệ, giảm kết nối vv), nơi một hoặc nhiều các pha có thể không cháy?

Trả lời

2

Không, chúng không được bảo đảm để được gọi.

Hãy nghĩ đến bộ lọc ủy quyền. Nếu ủy quyền không thành công, bạn có mong đợi bất kỳ bộ lọc hành động nào để chạy không? Đó có thể là một lỗ hổng bảo mật lớn. Tôi tin rằng một ngoại lệ cũng sẽ ngăn chặn các đường ống của bộ lọc và chỉ có bộ lọc ngoại lệ sẽ được thực hiện từ thời điểm đó.

Với bộ lọc sau:

public class ExampleFilterAttribute : FilterAttribute, IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // this code is never reached... 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     throw new NotImplementedException(); 
    } 
} 

trên controller action sau:

[ExampleFilter] 
public ActionResult Index() 
{ 
    // this code is never reached... 
    return View(); 
} 

Cả Index() phương pháp hoặc OnActionExecuted() là bao giờ đạt vì OnActionExecuting() có một ngoại lệ.

Các vấn đề liên quan