Asp.net 使用简单ActionFilterAttribute运行时出错

Asp.net 使用简单ActionFilterAttribute运行时出错,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,开始编写一个简单的过滤器,在每次操作加载时从请求中提取一些内容,从其他StackOverflow复制一些代码,如下所示: public class TestKeyAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext context) { if (context.Request.Properties.ContainsKey("test"

开始编写一个简单的过滤器,在每次操作加载时从请求中提取一些内容,从其他StackOverflow复制一些代码,如下所示:

public class TestKeyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext context)
    {
        if (context.Request.Properties.ContainsKey("test"))
        {
        // do stuff
        }
    }
}
然后将该属性与其余属性一起添加:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
    filters.Add(new TestKeyAttribute());
}
运行时,会导致以下错误:

The given filter instance must implement one or more of the following filter
interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.
我发现的大多数链接都与MVC3有关,这似乎是可行的;然而,我正在使用MVC4和WebAPI——现在是否有其他方法需要注册属性

请注意:我不希望将过滤器附加到Web API控制器(不过,将其添加到GlobalConfiguration.Configuration.Filters确实可以工作),而是希望附加到普通的Web控制器


编辑:我知道我可以通过从IActionFilter继承并使用OnActionExecuting来实现这一点,我只是好奇为什么这种方法不起作用,因为很多教程似乎都说它应该起作用。

当使用MVC4时,自定义属性所在的项目必须包含对System.Web.Http.Common库的引用。我使用NuGet和hey presto将其添加到我的项目中!错误消失。

这不起作用的原因是您的过滤器是WebAPI过滤器,不能与Mvc过滤器互换。Mvc和WebAPI FilterAttribute以及相关的类和接口有许多相同的名称(这就是为什么教程似乎说这应该是可行的),但它们位于不同的名称空间中。Mvc过滤器类位于
System.Web.Mvc
中,WebAPI类位于
System.Web.Http


进一步阅读这里:

我遇到了同样的错误,并且对
ElmaHandleErrorLoggerFilter
实现了
IEExceptionFilter
感到困惑

在调查之后,我踢了踢自己,我添加了
filters.Add(新的ElmahHandleErrorLoggerFilter())
到FilterConfig类下的MVC站点配置。添加
config.Filters.Add(新的ElmaHandleErrorRapiAttribute())改为WebApiConfig类工作


注意:我在这里使用的是WebAPi v1,但我已经以同样的方式配置了一个v2项目。

也对我有用!非常感谢。