我已經創建了一個Web Api過濾器(使用System.Web.Http.Filters.ActionFilterAttribute
),但我無法讓它在ASP.Net MVC 4中工作。我嘗試將它添加到RegisterGlobalFilters()
方法中,但這不起作用。如何添加全局ASP.Net Web Api過濾器?
因此,如果一個人使用ASP.Net MVC託管的Web Api如何註冊過濾器?
我已經創建了一個Web Api過濾器(使用System.Web.Http.Filters.ActionFilterAttribute
),但我無法讓它在ASP.Net MVC 4中工作。我嘗試將它添加到RegisterGlobalFilters()
方法中,但這不起作用。如何添加全局ASP.Net Web Api過濾器?
因此,如果一個人使用ASP.Net MVC託管的Web Api如何註冊過濾器?
下面的代碼,在我的Global.asax,工作對我來說:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
由於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);
}
而不是使用全球過濾器我更喜歡這樣做:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
而後從CustomizedApiControllerBase
繼承所有api控制器 與global.ascx文件中的全局過濾器相比,此方法更具表現力。
注意,這個答案也是如此高達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
命名空間中定義的少數過濾器接口之一。
有人可以解釋這裏發生了什麼嗎?爲什麼有兩套全球過濾器?這不會讓'全球'變成矛盾嗎? – 2012-06-27 09:55:59
一組過濾器用於MVC,另一組用於Web API。他們是兩件獨立的事情,通常你不希望過濾器被應用到另一個。 – 2012-08-29 15:26:10
我的WebApi過濾器被調用兩次。有人有這個問題嗎? – 2013-08-28 10:24:22