2012-03-01 65 views
83

我已經創建了一個Web Api過濾器(使用System.Web.Http.Filters.ActionFilterAttribute),但我無法讓它在ASP.Net MVC 4中工作。我嘗試將它添加到RegisterGlobalFilters()方法中,但這不起作用。如何添加全局ASP.Net Web Api過濾器?

因此,如果一個人使用ASP.Net MVC託管的Web Api如何註冊過濾器?

回答

94

下面的代碼,在我的Global.asax,工作對我來說:

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

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

有人可以解釋這裏發生了什麼嗎?爲什麼有兩套全球過濾器?這不會讓'全球'變成矛盾嗎? – 2012-06-27 09:55:59

+5

一組過濾器用於MVC,另一組用於Web API。他們是兩件獨立的事情,通常你不希望過濾器被應用到另一個。 – 2012-08-29 15:26:10

+2

我的WebApi過濾器被調用兩次。有人有這個問題嗎? – 2013-08-28 10:24:22

11

由於MVC 4 RC的,正確的類名是HttpFilterCollection

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

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

而不是使用全球過濾器我更喜歡這樣做:

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

而後從CustomizedApiControllerBase繼承所有api控制器 與global.ascx文件中的全局過濾器相比,此方法更具表現力。

62

注意,這個答案也是如此高達MVC 5 /網頁API 2

簡短的回答: MVC和Web API過濾器不會交叉兼容的,如果你想在全球範圍內註冊它們,你必須爲每個使用適當的配置類。

長的回答: ASP.NET MVC和Web API被特意設計爲以類似的方式工作,但它們實際上是不同的生物。

Web API位於System.Web.Http命名空間下,而MVC位於System.Web.Mvc命名空間下。這兩個人會幸福地並肩生活,但一個不包含另一個,儘管在編程模型中有相似之處,但底層實現是不同的。正如MVC控制器和Web API控制器繼承不同的基本控制器類(MVC的簡稱爲Controller,Web API的名稱爲ApiController),MVC過濾器和Web API過濾器繼承了不同的FilterAttribute類(兩者在此例中共享相同的名稱,但是分開生活在各自命名空間中的類)。

的Web API全局過濾器是通過在Register方法WebApiConfig.cs提供給您HttpConfiguration對象註冊,如果您使用的項目模板與WebActivator:

public static void Register(HttpConfiguration config) 
{ 
    //stuff before 
    config.Filters.Add(new MyWebApiFilter()); 
    //stuff after 
} 
在Global.asax

或以其他方式。 CS:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

的mvc全局過濾器由GlobalFilterCollection對象,這是提供給您通過FilterConfig.cs的RegisterGlobalFilters方法對項目的方式註冊了一個重新使用WebActivator:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //stuff before 
     filters.Add(new MyMvcFilter()); 
     //stuff after 
    } 
} 

或在global.asax中。通過GlobalFilters.Filters收集這些方式CS文件,而無需WebActivator:

GlobalFilters.Filters.Add(new MyMvcFilter()); 

值得一提的是,在這兩種情況下,你不需要來自相應FilterAttribute類型繼承。 Web API過濾器只需實現System.Web.Http.IFilter接口,而MVC過濾器註冊檢查可確保您的類繼承System.Web.Mvc命名空間中定義的少數過濾器接口之一。

+0

在webapiconfig.cs中添加自定義Web Api過濾器適用於我。我不明白爲什麼它沒有工作時,添加global.asax.cs – Tatipaka 2016-07-06 10:29:35

+0

謝謝@tatipaka。添加到webapiconfig工作。 – Gokulnath 2016-08-11 16:55:53

相關問題