Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4WebAPI寄存器过滤器_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

C# MVC4WebAPI寄存器过滤器

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()

我正在使用MVC4WebAPI为应用程序创建服务层。我正在尝试创建一个全局过滤器,该过滤器将对API的所有传入请求起作用。现在我了解到,必须对其进行不同于标准MVC全局操作过滤器的配置。但我在网上找到的任何一个例子都有问题

我遇到的问题是用Web API注册过滤器

我的Global.asax设置如下

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