1

ReCaptcha.net NuGetパッケージhttp://recaptchanet.codeplex.com/wikipage?title=How%20to%20Use%20Recaptcha%20in%20an%20ASP.NET%20MVC%20Web%20Applicationを使用して、MVC3にReCaptchaを実装しました。非常に遅い場合があり、これらのページにボリュームがある可能性があるため、これを非同期として実装できるかどうかを確認したい場合を除いて、すべて正常に機能しています。

指示は言う

RecaptchaVerificationResult recaptchaResult = await recaptchaHelper.VerifyRecaptchaResponse();

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

ただし、これはMVC4await構文を使用しています。MVC3非同期フレームワーク内でこのメソッドを使用する方法はありますか?

私は簡単なハックを試みました。コントローラーをAsyncControllerに変換し、メソッドにAsyncサフィックスを付けて名前を付け、アクション全体をTask.Factory.StartNew(()=> {...});でラップしました。非非同期構文を使用している間、ただしRecaptchaVerificationHelper recaptchaHelper = this.GetRecaptchaVerificationHelper(); HTTPContextの欠如について不平を言います。

だから、MVC3でReCaptchaを非同期で行うのを誰かが助けてくれますか?

4

1 に答える 1

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完全に機能しているようです。

于 2013-03-13T09:16:58.763 に答える