2013-03-12 77 views
1

我已經使用ReCapt unavailable NuGet包http://recaptchanet.codeplex.com/wikipage?title=How%20to%20Use%20Recaptcha%20in%20an%20ASP.NET%20MVC%20Web%20Application在MVC3中實現了ReCaptcha。一切運行良好,除非我想看看我是否可以將其作爲異步實現,因爲它有時非常慢,而且我們可能在這些頁面上有一定的音量。MVC3中的ASync Recaptcha

的指示說

RecaptchaVerificationResult recaptchaResult = await recaptchaHelper.VerifyRecaptchaResponse(); 

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

然而,這是使用MVC4等待語法。有沒有一種方法可以在MVC3異步框架中使用此方法?我嘗試了一個快速入侵,將控制器轉換爲AsyncController,並用Async後綴命名該方法,並將整個動作封裝在Task.Factory.StartNew((=){...})中;而使用非異步語法,但RecaptchaVerificationHelper recaptchaHelper = this.GetRecaptchaVerificationHelper();抱怨缺乏HTTPContext。

因此,誰能幫助我與異步在MVC3

回答

1

做的reCAPTCHA最終,我已經使用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; 
    } 

有了這個地方,我分裂我原來的控制器的方法成異步/完成對,並且包裹在Task.Factory.StartNew它的工作(()=> {...}),以下這裏概述的模式http://www.deanhume.com/Home/BlogPost/mvc-asynchronous-controller---the-basics/67似乎完美的工作。