2014-12-07 201 views
0

我已经创建了一个基本控制器,它包含一个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 
} 

但是没有ActionFilters的将执行时发出请求。我已确保每个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]属性,过滤器就可以工作。但确保角色在这里得到遵守很重要。

回答

0

这可能会帮助: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()); 
+0

可悲的是,如果我将这些添加到Global.asax中,似乎没有什么区别。如果这有什么不同,我已经用编辑更新了我的问题? – 2014-12-07 21:16:21

0

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