MVC3中的ASync Recaptcha

时间:2013-03-12 17:48:57

标签: asp.net-mvc-3 asynchronous recaptcha mvcrecaptcha

我使用ReCaptcha.net NuGet包http://recaptchanet.codeplex.com/wikipage?title=How%20to%20Use%20Recaptcha%20in%20an%20ASP.NET%20MVC%20Web%20Application在MVC3中实现了ReCaptcha。一切运作良好,除了我想看看我是否可以将其作为Async实现,因为它有时很慢,我们可能在这些页面上有一些量。

说明说

RecaptchaVerificationResult recaptchaResult = await recaptchaHelper.VerifyRecaptchaResponse();

if (recaptchaResult != RecaptchaVerificationResult.Success)
{
    ModelState.AddModelError("", "Incorrect captcha answer.");
}

但是,这是使用MVC4 await语法。有没有办法在MVC3异步框架中使用这个方法?

我确实尝试了快速入侵,将控制器转换为AsyncController,使用Async后缀命名方法,并将整个操作包装在Task.Factory.StartNew(()=> {...})中;虽然使用非异步语法,但RecaptchaVerificationHelper recaptchaHelper = this.GetRecaptchaVerificationHelper();抱怨缺少HTTPContext。

那么,任何人都可以帮我在MVC3中异步进行ReCaptcha

1 个答案:

答案 0 :(得分:1)

最后,我已经放弃使用NuGet包,只使用下面的代码处理验证码,绑定控制器方法中的recaptcha字段。

    public bool ProcessCaptcha(string recaptcha_challenge_field, string recaptcha_response_field)
    {

        const string verifyUrl = "http://www.google.com/recaptcha/api/verify";
        var res = true;
        var ip = Request.UserHostAddress;
        if (ip == "::1") ip = "127.0.0.1";
        var myParameters = string.Format("privatekey={0}&remoteip={1}&challenge={2}&response={3}", Config.CaptchPriv, ip, recaptcha_challenge_field, recaptcha_response_field);
        using (WebClient wc = new WebClient())
        {
            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            string HtmlResult = wc.UploadString(verifyUrl, myParameters);
            var split = HtmlResult.Split('\n');
            if (split[0] == "false") res = false;
        }

        return res;
    }

有了这个,我将我的原始控制器方法拆分为Async / Completed对,并将其在Task.Factory.StartNew(()=> {...})中完成的工作包装起来,遵循概述的模式这里http://www.deanhume.com/Home/BlogPost/mvc-asynchronous-controller---the-basics/67似乎完美无缺。