4

开始编写一个简单的过滤器,在每次动作加载时从请求中提取一些东西,从其他 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.

我发现的大多数链接都与 MVC 3 相关,这似乎可行;但是,我正在使用 MVC 4 并使用 Web API - 我现在需要通过其他方式注册属性吗?

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

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

4

3 回答 3

7

我遇到了同样的错误,并且和ElmahHandledErrorLoggerFilterimplement一样感到困惑IExceptionFilter

经过调查,我踢了自己,我将其添加filters.Add(new ElmahHandledErrorLoggerFilter());到 FilterConfig 类下的 MVC 站点配置中。config.Filters.Add(new ElmahHandleErrorApiAttribute());改为添加到 WebApiConfig 类有效。

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

于 2015-09-11T08:13:05.630 回答
3

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

进一步阅读:https ://stackoverflow.com/a/23094418/22392

于 2014-12-04T15:42:32.873 回答
1

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

于 2013-06-10T23:01:16.700 回答