【问题标题】:Custom Action Filters don't execute at runtime自定义操作过滤器不在运行时执行
【发布时间】:2014-12-07 20:47:21
【问题描述】:

我创建了一个包含 UnitOfWork 的基本控制器,这样我就不必一直对其进行更新。在这个控制器中,我还添加了三个要运行每个请求的操作过滤器:

[ElmahLogFilter]
[LoggingActionFilter]
[RequestValidationFilter]
public class BaseController : ApiController
{
    private UnitOfWork _unitOfWork;
    public UnitOfWork UnitOfWork
    {
        get { return _unitOfWork ?? (_unitOfWork = new UnitOfWork()); }
    }
}

然后我只定义了一个控制器,如下所示:

[System.Web.Http.Authorize(Roles = "Host, Guest")]
public class MeetingController : BaseController
{
    //Code in here
}

但是,在发出请求时,任何 ActionFilter 都不会执行。我确保每个 ActionFilter 都在 System.Web.Http.Filters 命名空间之外工作,不会与 MVC 版本冲突。这是我的一个过滤器的样子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Filters;

public class LoggingActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        //Logging Code Here
        base.OnActionExecuted(actionExecutedContext);
    }
}

我花了一段时间试图简单地执行一个动作过滤器,但到目前为止还没有骰子。我有什么遗漏吗?

编辑: 一旦我删除 [Authorize] 属性,过滤器就会工作。但重要的是要确保角色在这里得到遵守。

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2


    【解决方案1】:

    这可能会有所帮助:How does inheritance work for Attributes?

    这也可能有帮助:How to add global ASP.Net Web Api Filters?

    如果您希望这些过滤器在每个请求上都执行,那么在 Application_Start 期间执行这样的操作可能是您最好的选择:

    GlobalConfiguration.Configuration.Filters.Add(new ElmahLogFilter());
    GlobalConfiguration.Configuration.Filters.Add(new LoggingActionFilter());
    GlobalConfiguration.Configuration.Filters.Add(new RequestValidationFilter());
    

    【讨论】:

    • 可悲的是,如果我将这些添加到 Global.asax 中似乎并没有什么不同。如果这有什么不同,我已经通过编辑更新了我的问题?
    【解决方案2】:

    授权过滤器在动作过滤器之前运行,如果身份未被授权,管道将被短路。也就是说,在您的情况下,如果用户不是所需的角色,则任何操作过滤器或操作方法本身都不会运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多