lưu ý rằng câu trả lời này đúng đến MVC 5/Web API 2
Câu trả lời ngắn: MVC và API Web filters không vượt tương thích, và nếu bạn muốn đăng ký họ 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 mỗi lớp.
Câu trả lời dài: ASP.NET MVC và Web API được thiết kế cố tình để hoạt động theo cách tương tự, nhưng thực tế chúng khác nhau.
Cuộc sống API Web dưới không gian tên System.Web.Http
, trong khi MVC sống dưới không gian tên System.Web.Mvc
. Cả hai sẽ sống hạnh phúc bên cạnh nhau, nhưng người ta không chứa người kia và bất chấp những điểm tương đồng trong mô hình lập trình, các triển khai cơ bản khác nhau. Cũng giống như các bộ điều khiển MVC và các bộ điều khiển Web API kế thừa các lớp điều khiển cơ sở khác nhau (MVC đơn giản có tên là Controller
và Web API được đặt tên là ApiController
) Bộ lọc MVC và bộ lọc Web API kế thừa từ các lớp khác nhau (cả hai cùng tên trong trường hợp này). các lớp học sống trong các không gian tên tương ứng của chúng). bộ lọc
Web API toàn cầu được đăng ký thông qua các đối tượng HttpConfiguration
sẵn cho bạn trong Register
WebApiConfig.cs phương pháp nếu bạn đang sử dụng một 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());
MVC lọc toàn cầu được đăng ký bằng cách của một đối tượng GlobalFilterCollection
, trong đó có sẵn cho bạn thông qua phương pháp RegisterGlobalFilters
của FilterConfig.cs cho các dự án mà một đang sử dụng lại WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
hoặc trong global.asax.cs tập tin bằng cách GlobalFilters.Filters
bộ sưu tập cho những người không WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Nó đáng chú ý rằng trong cả hai trường hợp, bạn không cần phải kế thừa từ thích hợp FilterAttribute
loại. Bộ lọc API Web chỉ cần triển khai giao diện System.Web.Http.IFilter, trong khi kiểm tra bộ lọc MVC kiểm tra để đảm bảo rằng lớp của bạn thừa hưởng một trong số ít giao diện bộ lọc được xác định trong không gian tên System.Web.Mvc
.
Ai đó có thể giải thích những gì đang xảy ra ở đây? Tại sao có hai bộ lọc Toàn cầu? Điều đó có làm cho 'Global' trở thành một oxymoron không? –
Một bộ lọc dành cho MVC và bộ lọc kia dành cho API Web. Họ là hai điều riêng biệt và thông thường bạn sẽ không muốn bộ lọc cho một được áp dụng cho người khác. –
Bộ lọc WebApi của tôi được gọi hai lần. Có ai vấn đề này? –