2015-08-26 51 views
0

我想知道爲什麼變量IgnoreRequest在我的web api 2.2中設置爲true後總是爲false。忽略Web Api過濾器中的變量

過濾器:

public class RestrictToCandidatePlus : ActionFilterAttribute 
{ 
    public virtual bool IgnoreRequest { get; set; } 

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     bool validAccType = 2 == 1; //original code hidden 
     if (!IgnoreRequest && !validAccType) 
     { 
      HandleUnauthorizedRequest(actionContext); 
      return; 
     } 
     base.OnActionExecuting(actionContext); 
    } 

    private void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     actionContext.Response = actionContext.Request.CreateResponse<String>(HttpStatusCode.Unauthorized, "Invalid account type");    
    } 
} 

而且控制器:

[Filter1] 
[Filter2] 
[RestrictToCandidatePlus] 
public class PlusCandidateController : ApiController 
{ 
    [RestrictToCandidatePlus(IgnoreRequest = true)] 
    [HttpPost] 
    public HttpResponseMessage SetInterest([FromBody] SetInterestModel model) 
    { 
     //some logic 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

我有我的MVC5應用正好與過濾器相同的邏輯和它的作品般的魅力。我知道MVC中的過濾器與Web Api中的過濾器不同,但我認爲我應該能夠將IgnoreRequest變量設置爲true。如你所見,我不能使用OverrideActionFiltersAttribute,否則會禁用Filter1和Filter2,這不是我想要的。

+0

我只是想在我的控制器的一個你'RestrictToCandidatePlus'屬性,當我打了一個破發指向'if(!IgnoreRequest &&!validAccType)''IgnoreRequest'是真的。 – Padhraic

+0

這是在WebApi 2.2上?我知道它適用於MVC ... – WPalombini

回答

1

測試這一點,我終於找到了問題。問題是相同的過濾器運行兩次,從Action(HttpResponseMessage)開始,然後是Controller。所以如果我在控制器級別設置IgnoreRequest = true,我可以看到設置爲true的值。 但主要的問題是,過濾器運行兩次,所以要解決這個問題,我不得不重寫以下屬性:

public class RestrictToCandidatePlus : ActionFilterAttribute 
{ 
    public virtual bool IgnoreRequest { get; set; } 

    public override bool AllowMultiple { get { return false; } } // <= HERE! 

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     bool validAccType = 2 == 1; //original code hidden 
     if (!IgnoreRequest && !validAccType) 
     { 
      HandleUnauthorizedRequest(actionContext); 
      return; 
     } 
     base.OnActionExecuting(actionContext); 
    } 

    private void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     actionContext.Response = actionContext.Request.CreateResponse<String>(HttpStatusCode.Unauthorized, "Invalid account type");    
    } 
} 
1

IgnoreRequest永遠是假的,因爲控制器級別屬性正在評估第一,你是錯誤處理之前可以評估動作屬性..

而不是使用布爾覆蓋或阻止你的屬性評價,您可以覆蓋ActionFilterAttribute通過使用OverrideActionFiltersAttribute

這將覆蓋在控制器級定義的從ActionFilterAttribute繼承的任何屬性。

這裏是一個更新的屬性:

public class RestrictToCandidatePlus : ActionFilterAttribute 
{ 
    // dont need this 
    //public virtual bool IgnoreRequest { get; set; } 

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     bool validAccType = 2 == 1; //original code hidden 
     //if (!IgnoreRequest && !validAccType) 
     if(!validAccType) 
     { 
      HandleUnauthorizedRequest(actionContext); 
      return; 
     } 
     base.OnActionExecuting(actionContext); 
    } 

    private void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     actionContext.Response = actionContext.Request.CreateResponse<String>(HttpStatusCode.Unauthorized, "Invalid account type");    
    } 
} 

更新控制器:

[RestrictToCandidatePlus] 
public class PlusCandidateController : ApiController 
{ 
    [OverrideActionFiltersAttribute]// <== new attribute here 
    [HttpPost] 
    public HttpResponseMessage SetInterest([FromBody] SetInterestModel model) 
    { 
     //some logic 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

您可以創建自己的屬性類從OverrideActionFiltersAttribute繼承,如果你想給它自己的名字一樣[OverrideCandidatePlus]

有一篇很棒的博客文章here解釋了這是如何工作的。

注: 我與的WebAPI 2.2

+0

嗨,隊友,非常感謝幫助我。也許我應該在問題中提到這一點,但事實上我目前正在使用此解決方案作爲解決方法。實際情況是:我在控制器上有3個過濾器,但我只需要忽略一個。如果我使用OverrideActionFiltersAttribute,它會忽略其他2個過濾器。因此,爲什麼我需要IgnoreRequest布爾值。除非你有另外的建議來克服這個問題?非常感謝您再次嘗試幫助 – WPalombini