Làm cách nào để thêm Bộ lọc ASP.Net Web Api toàn cầu?


98

Tôi đã tạo bộ lọc Web Api (bằng cách sử dụng System.Web.Http.Filters.ActionFilterAttribute) nhưng tôi không thể làm cho nó hoạt động bên trong ASP.Net MVC 4. Tôi đã thử thêm nó vàoRegisterGlobalFilters() phương thức nhưng không hiệu quả.

Vì vậy, nếu một người đang sử dụng Web Api được lưu trữ trong ASP.Net MVC thì làm thế nào để đăng ký bộ lọc?

Câu trả lời:


110

Đoạn mã sau, trong Global.asax của tôi, phù hợp với tôi:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

6
Ai đó có thể giải thích những gì đang xảy ra ở đây? Tại sao lại có hai bộ lọc Toàn cục? Điều đó không làm cho 'Global' trở thành oxymoron sao?
Luke Puplett,

6
Một bộ lọc dành cho MVC và bộ lọc còn lại dành cho API Web. Chúng là hai thứ riêng biệt và thông thường bạn sẽ không muốn bộ lọc cho cái này được áp dụng cho cái kia.
Shane Courtrille,

2
Bộ lọc WebApi của tôi được gọi hai lần. Có ai vấn đề này không?
Andrew Kalashnikov

87

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.


Thêm bộ lọc Web Api tùy chỉnh trong webapiconfig.cs phù hợp với tôi. Tôi không hiểu tại sao nó không làm việc khi thêm vào trong global.asax.cs
Tatipaka

cảm ơn @tatipaka. thêm vào webapiconfig đã hoạt động.
Gokulnath

12

Kể từ MVC 4 RC, tên lớp chính xác là HttpFilterCollection :

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
    filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

8

Thay vì sử dụng các bộ lọc chung, tôi muốn làm điều này:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

Và sau đó kế thừa tất cả các bộ điều khiển api từ CustomizedApiControllerBase Cách tiếp cận này rõ ràng hơn so với các bộ lọc toàn cục trong tệp global.ascx.


Tôi đã tạo một Bộ lọc kế thừa từ System.Web.Http.Filters.ActionFilterAttribute và tiếp tục sử dụng nó trực tiếp trên các phương thức mà tôi yêu cầu. Nó chỉ hoạt động, vậy tại sao tôi không cần đăng ký nó?
joedotnot

@joedotnot Đó là về các bộ lọc "toàn cầu" không phải các bộ lọc cụ thể. Nếu bạn có thể chỉ định phương pháp nào bạn muốn lọc, cách tiếp cận của bạn là OK nhưng khi bạn muốn lọc bất kể hành động của bộ điều khiển, bạn cần bộ lọc toàn cục.
Mahmoud Moravej
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.