2012-03-01 26 views
83

Tôi đã tạo bộ lọc Web Api (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 phương thức này vào phương pháp RegisterGlobalFilters() nhưng không hoạt động.Làm thế nào để thêm toàn cầu ASP.Net Web Api bộ lọc?

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

Trả lời

94

Các mã sau đây, trong Global.asax của tôi, làm việc cho 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 có hai bộ lọc Toàn cầu? Điều đó có làm cho 'Global' trở thành một oxymoron không? –

+5

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. –

+2

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

11

Tính đến MVC 4 RC, tên lớp đúng là HttpFilterCollection:

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

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

Thay vì sử dụng bộ lọc toàn cầu Tôi thích 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 mang tính biểu cảm hơn so với các bộ lọc toàn cục trong tệp global.ascx.

62

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.

+0

Thêm bộ lọc Web Api tùy chỉnh trong webapiconfig.cs hoạt động cho tôi. Tôi không hiểu tại sao nó không hoạt động khi được thêm vào trong global.asax.cs – Tatipaka

+0

nhờ @tatipaka. thêm vào webapiconfig đã hoạt động. – Gokulnath

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