Web Api过滤器中的变量被忽略

时间:2015-08-26 01:16:02

标签: asp.net asp.net-web-api filter

我想了解为什么变量IgnoreRequest在我的web api 2.2中设置为true后总是为false。

过滤器:

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,这不是我想要的。

1 个答案:

答案 0 :(得分:1)

IgnoreRequest始终为false,因为首先评估控制器级别属性,然后在评估action属性之前进行错误处理。

您可以使用ActionFilterAttribute覆盖OverrideActionFiltersAttribute,而不是使用bool覆盖或屏蔽属性评估。

这将覆盖从控制器级别定义的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测试了这个