我想了解为什么变量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,这不是我想要的。
答案 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测试了这个