C# Web API v2筛选器检查同一字段的不同类型
我在API过滤器中有下面的代码。C# Web API v2筛选器检查同一字段的不同类型,c#,asp.net-web-api2,C#,Asp.net Web Api2,我在API过滤器中有下面的代码。SampleRequester对象只是表单中的信息。它有一个名为captcha的属性。它工作的很好,但我有其他形式,也将有一个验证码属性。这只适用于SampleRequester对象。如何检查任何对象的captcha属性 public class ValidateCaptcha : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionC
SampleRequester
对象只是表单中的信息。它有一个名为captcha的属性。它工作的很好,但我有其他形式,也将有一个验证码属性。这只适用于SampleRequester
对象。如何检查任何对象的captcha属性
public class ValidateCaptcha : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var cookiePayload = actionContext.Request.GetCookie("MyCaptcha");
SampleRequester requester = (SampleRequester)actionContext.ActionArguments["requester"];
if(cookiePayload !== requester.captcha)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
}
如果您事先知道可能的类型,可以使用
as
操作符:
public class ValidateCaptcha : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var cookiePayload = actionContext.Request.GetCookie("MyCaptcha");
var requester = actionContext.ActionArguments["requester"] as SampleRequester;
if (requester != null && cookiePayload == requester.captcha)
return;
requester = actionContext.ActionArguments["requester"] as AnotherRequester;
if (requester != null && cookiePayload == requester.captcha)
return;
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
如果没有,但希望任何类型都具有属性captcha
,则可以使用dynamic
:
public class ValidateCaptcha : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var cookiePayload = actionContext.Request.GetCookie("MyCaptcha");
dynamic requester = actionContext.ActionArguments["requester"];
if (requester != null && cookiePayload == requester.captcha)
return;
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
理想情况下,第一个选项是确保所有请求者实现相同的接口,这样您就可以将用作接口类型
我想知道,为什么Cookie中有Captcha
值?我的解决方案是使用继承。我创建了一个名为Form
的基类,它只有captcha属性。然后,在过滤器中,我只需将请求者
对象转换为表单
对象。完整示例如下所示:
public class ValidateCaptcha : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var cookiePayload = actionContext.Request.GetCookie("MyCaptcha");
Form form = (Form)actionContext.ActionArguments["requester"];
if(cookiePayload != form.captcha)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
}
我还能把它放在哪里?我简化了我的例子,因为我不认为这部分是回答我问题的必要部分。你说的“我可以把它放在哪里”是什么意思?我介绍了两种方法,可以在“请求者”actionArgument中存在的任何对象上查找“captcha”属性。你能更好地描述一下你的情况吗?