lưu ý rằng câu trả lời này đúng với MVC 5 / Web API 2
Câu trả lời ngắn gọn: Các bộ lọc MVC và Web API không tương thích chéo và nếu bạn muốn đăng ký chúng trên toàn cầu, bạn phải sử dụng các lớp cấu hình thích hợp cho từng loại.
Câu trả lời dài: ASP.NET MVC và Web API được thiết kế có chủ đích để hoạt động theo cách giống nhau, nhưng trên thực tế chúng là những sinh vật khác nhau.
API web nằm dưới System.Web.Httpkhông gian tên, trong khi MVC nằm dưới System.Web.Mvckhông gian tên. Hai người sẽ sống hạnh phúc bên cạnh nhau, nhưng cái này không chứa cái kia và mặc dù có những điểm tương đồng trong mô hình lập trình, nhưng cách triển khai cơ bản là khác nhau. Cũng giống như bộ điều khiển MVC và bộ điều khiển API Web kế thừa các lớp bộ điều khiển cơ sở khác nhau (MVC được đặt tên đơn giản Controllervà đặt tên của API Web ApiController) bộ lọc MVC và bộ lọc Web API kế thừa từ các FilterAttributelớp khác nhau (cả hai đều có chung tên trong trường hợp này, nhưng là các lớp riêng biệt tồn tại trong không gian tên tương ứng của chúng).
Các bộ lọc chung của API Web được đăng ký thông qua HttpConfigurationđối tượng có sẵn cho bạn trong Registerphương thức WebApiConfig.cs nếu bạn đang sử dụng mẫu dự án với WebActivator:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
hoặc trong global.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Bộ lọc toàn cầu Mvc được đăng ký theo cách của một GlobalFilterCollectionđối tượng, có sẵn cho bạn thông qua RegisterGlobalFiltersphương thức FilterConfig.cs cho các dự án đang sử dụng WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
hoặc trong tệp global.asax.cs theo cách GlobalFilters.Filtersthu thập cho những người không có WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Cần lưu ý rằng trong cả hai trường hợp, bạn không cần phải kế thừa từ FilterAttributeloại thích hợp . Bộ lọc Web API chỉ cần triển khai giao diện System.Web.Http.IFilter, trong khi đăng ký bộ lọc MVC kiểm tra để đảm bảo rằng lớp của bạn kế thừa một trong số ít các giao diện bộ lọc được xác định trong System.Web.Mvckhông gian tên.