2014-12-07 153 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

授權過濾器在操作過濾器之前運行,如果身份未經授權,管道將被短路。也就是說,就你而言,如果用戶不在所需的角色中,則不會運行任何操作過濾器或操作方法本身。