C# MVC4WebAPI寄存器过滤器
我正在使用MVC4WebAPI为应用程序创建服务层。我正在尝试创建一个全局过滤器,该过滤器将对API的所有传入请求起作用。现在我了解到,必须对其进行不同于标准MVC全局操作过滤器的配置。但我在网上找到的任何一个例子都有问题 我遇到的问题是用Web API注册过滤器 我的Global.asax设置如下C# MVC4WebAPI寄存器过滤器,c#,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,我正在使用MVC4WebAPI为应用程序创建服务层。我正在尝试创建一个全局过滤器,该过滤器将对API的所有传入请求起作用。现在我了解到,必须对其进行不同于标准MVC全局操作过滤器的配置。但我在网上找到的任何一个例子都有问题 我遇到的问题是用Web API注册过滤器 我的Global.asax设置如下 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start()
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
MVCConfig.RegisterRoutes(RouteTable.Routes);
MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters);
WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration);
WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters);
}
}
我的标准Mvc路由和过滤器工作正常。我的WebApi路由也是如此。以下是我的webApi过滤器注册的内容
public static void RegisterGlobalFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new PerformanceTestFilter());
}
这是PerformanceTestFilter
public class PerformanceTestFilter : ActionFilterAttribute
{
private readonly Stopwatch _stopWatch = new Stopwatch();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_stopWatch.Reset();
_stopWatch.Start();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
_stopWatch.Stop();
var executionTime = _stopWatch.ElapsedMilliseconds;
// Do something with the executionTime
}
}
当使用标准Mvc GlobalFilterCollection注册时,此筛选器工作正常,但当我尝试使用System.Web.Http.Filters.HttpFilterCollection注册它时,我收到一个错误,表示它不可分配给参数类型System.Web.Http.Filters.IFilter
因此,我假设PerformanceTestFilter需要从ActionFilterAttribute以外的其他内容继承,以便注册为webapi筛选器。我只是不知道该怎么做
我想我需要创建两个单独的过滤器来分别使用mvc和webapi。如果有一种方法可以创建一个可以同时注册到两者的过滤器,那就太好了。但我主要关心的是如何让它为webapi工作
谢谢以下功能应该可以使用。实际上,我们将其用于我们的web API项目
GlobalConfiguration.Configuration.Filters
的类型为HttpFilterCollection
var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters;
filters.Clear();
filters.Add(new ValidationActionFilterAttribute());
public class ValidationActionFilterAttribute : FilterAttribute, IActionFilter, IFilter
{
...
}
另外,如果您在一个同时包含MVC和WebAPI组件的项目中工作,您能检查一下您的名称空间是什么吗
ActionFilterAttribute的命名空间。这是相当令人困惑的原因
这两项下都有两个ActionFilterAttribute:
资料来源:
看起来您需要有两个过滤器,一个用于API,一个用于MVC。您可以将公共代码分解成一个单独的类,然后只使用特定的过滤器来调用您的公共类,这样就不会违反DRY,基本上使用实际的过滤器作为包装器,可以注册为过滤器 好的,这个解决方案允许我构建项目,并且我已经将我的过滤器注册到Web API的“System.Web.Http.Filters.HttpFilterCollection”和标准MVC操作过滤的“GlobalFilterCollection”。但是,当我导航到其中一个api方法时,并没有执行过滤器。过滤器适用于标准MVC控制器操作,但不适用于Web API方法。有什么建议吗?提出一个新问题。不要在评论中提出新问题。@Sam,为什么在添加自己的过滤器集合之前要清除过滤器集合?
System.Web.Http.Filters
System.Web.Http.Mvc