Sha*_*lle 96 asp.net-mvc-4 asp.net-web-api
我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute),但我无法让它在ASP.Net MVC 4中运行.我尝试将其添加到RegisterGlobalFilters()方法但是没有用.
因此,如果使用ASP.Net MVC中托管的Web Api,如何注册过滤器?
小智 109
我的Global.asax中的以下代码适用于我:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Run Code Online (Sandbox Code Playgroud)
joe*_*dev 84
请注意,这个答案适用于MVC 5/Web 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类(在这种情况下它们共享相同的名称,但是它们是独立的类在各自的命名空间中).
如果您正在使用带有WebActivator的项目模板,则Web API全局过滤器将通过WebApiConfig.cs方法中HttpConfiguration可用的对象进行注册Register:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
Run Code Online (Sandbox Code Playgroud)
或者在global.asax.cs中:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Run Code Online (Sandbox Code Playgroud)
Mvc全局过滤器是通过GlobalFilterCollection对象注册的RegisterGlobalFilters,对于使用WebActivator的项目,可以通过FilterConfig.cs 的方法使用该对象:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
Run Code Online (Sandbox Code Playgroud)
或者在GlobalFilters.Filters没有WebActivator的情况下通过集合在global.asax.cs文件中:
GlobalFilters.Filters.Add(new MyMvcFilter());
Run Code Online (Sandbox Code Playgroud)
值得注意的是,在这两种情况下,您都不需要从适当的FilterAttribute类型继承.Web API过滤器只需实现System.Web.Http.IFilter接口,而MVC过滤器注册检查以确保您的类继承了System.Web.Mvc命名空间中定义的少数过滤器接口之一.
nuz*_*ilo 12
从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);
}
Run Code Online (Sandbox Code Playgroud)
我没有使用全局过滤器,而是喜欢这样做:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
Run Code Online (Sandbox Code Playgroud)
之后继承了所有的api控制器.CustomizedApiControllerBase
与global.ascx文件中的全局过滤器相比,这种方法更具表现力.
| 归档时间: |
|
| 查看次数: |
63186 次 |
| 最近记录: |