7

Tôi đã đi qua một hành vi kỳ lạ nhưng tôi không chắc chắn nếu tôi đang đi đúng hướng ở đây.Bộ lọc của GlobalFilterCollection chạy trước khi Bộ lọc của ControllerInstanceFilterProvider

Tôi có bộ điều khiển ghi đè OnException phương thức của lớp cơ sở Controller.

public class ControllerFiltersController : Controller { 

    public ActionResult Index() { 

     throw new NotImplementedException(); 
    } 

    protected override void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "ControllerFiltersController Exception: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

Tôi cũng có một tùy chỉnh ExceptionFilter như sau:

public class HandleErrorCustom : IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "HandleErrorCustom Exception Message: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

Sau đó, tôi đã đăng ký nó như một bộ lọc toàn cầu:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new HandleErrorCustom()); 
} 

gì tôi mong đợi là đây để dụ điều khiển lọc để chạy trước bộ lọc chung vì thứ tự bộ lọc được cung cấp bởi ControllerInstanceFilterProviderInt32.MinValue và t phạm vi của họ là FilterScope.First.

Như cũng giải thích ở đây: ASP.NET MVC 3 Service Location, Part 4: Filters

Nhưng kết quả là khác nhau:

Thông tin iisexpress.exe: 0: HandleErrorCustom Exception nhắn: 06: 56: 49,972

iisexpress.exe Thông tin: 0: ControllerFiltersController Exception: 06: 56: 49.974

Đây là một ứng dụng ASP.NET MVC 4 và tôi không biết bất kỳ thay đổi nào ảnh hưởng đến hành vi sắp xếp bộ lọc của ASP.NET MVC 3. Tôi thiếu gì ở đây?

Trả lời

12

Đây là hành vi mong đợi.

Thứ tự lọc phụ thuộc vào hướng thông tin đang chảy. Nếu thông tin đang chảy vào hành động, thì thứ tự như bạn mong đợi; nếu thông tin đang chảy ngược trở lại từ hành động, thì lệnh được đảo ngược.

Ví dụ: giả sử bạn có ba bộ lọc theo thứ tự sau: F1, F2, F3. Giả sử rằng đây là các bộ lọc hành động (có nghĩa là, chúng đang nghe ActionExecuting và ActionExecuted). Trình tự hệ thống sẽ chạy chúng như sau:

F1.ActionExecuting() 
F2.ActionExecuting() 
F3.ActionExecuting() 
Action() 
F3.ActionExecuted() 
F2.ActionExecuted() 
F1.ActionExecuted() 

xử lý Lỗi là, theo định nghĩa, các bộ lọc chạy trên sự trở lại phía các hành động, vì vậy thứ tự của chúng bị đảo ngược.

+0

Bây giờ, tôi hiểu rồi. Vì vậy, các bộ lọc, có giá trị thấp hơn và chạy trên mặt trả về của các hành động, sẽ chạy đầu tiên. Cảm ơn! – tugberk