C# Web API v2筛选器检查同一字段的不同类型

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

我在API过滤器中有下面的代码。
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”属性。你能更好地描述一下你的情况吗?