2017-04-10 108 views
1

我有一個ASP.NET Web API 2項目。我正在嘗試從表單中讀取Google Captcha。 我嘗試這樣做代碼:Google Web API 2中的reCaptcha c#

public string Post(FoundingRequest model) 
    { 
     var response = Request["g-recaptcha-response"]; 
     string secretKey = "my key"; 
     var client = new WebClient(); 
     var result = client.DownloadString(
     $"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={response}"); 
     var obj = JObject.Parse(result); 
     model.Captcha = (bool)obj.SelectToken("success"); 
     .... 
    } 

但我在第一行接收錯誤:

無法應用用[]索引到類型 'HttpRequestMessage'

的表達

爲什麼?以及如何解決它?謝謝

回答

1

我找到了答案,我創建了一個隱藏的文件具有特定名稱和更新其對驗證碼的呼叫值回。代碼:

<input type="hidden" value="" id="recaptcha" name="recaptcha" /> 
    <div class="g-recaptcha" data-callback="imNotARobot" data-sitekey="key"></div> 

和JavaScript是:

<script type="text/javascript"> 
    var imNotARobot = function() { 
     $("#recaptcha").val(grecaptcha.getResponse()); 
    }; 
</script> 

服務器端:

public string Recaptcha { get; set; } 

和粘合劑做所有的工作。

3

這個方法對我的身體正常工作:

const string secretKey = "YOUR KEY"; 
      string responseFromServer = ""; 

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.google.com/recaptcha/api/siteverify?secret=" + secretKey + "&response=" + response); 

      using (WebResponse resp = req.GetResponse()) 
      using (Stream dataStream = resp.GetResponseStream()) 
      { 
       if (dataStream != null) 
       { 
        using (StreamReader reader = new StreamReader(dataStream)) 
        { 
         // Read the content. 
         responseFromServer = reader.ReadToEnd(); 
        } 
       } 
      } 

      dynamic jsonResponse = new JavaScriptSerializer().DeserializeObject(responseFromServer); 

      return jsonResponse == null || bool.Parse(jsonResponse["success"].ToString()); 

更新

至於評論,也可以在客戶端進行檢查

var response = window.grecaptcha.getResponse()

而且然後將該變量傳遞給Web API

這是我的客戶端腳本的一部分:

 if (typeof window.grecaptcha != 'undefined') { 
     var capResponse = window.grecaptcha.getResponse(); 

     if (!capResponse || capResponse.length === 0) { 
      user.isCaptchaPassed = false; 
      //alert("Captcha not Passed"); 
      return false; 
     } 

     user.gReCaptcha = capResponse; 
    } 

「用戶」是之前創建的JS對象,通過JS傳遞給服務器。 (AJAX調用)

+0

問題出現在這一行:var response = Request [「g-recaptcha-response」]; –

+0

檢查更新。它應該在JS和Web API的情況下工作 – SouXin

-1

我認爲這個請求是從表單來的,改變這種:

var response = Request["g-recaptcha-response"]; 

要這樣:

var response = Request.Form["g-Recaptcha-Response"]; 

也會改變這樣:

var result = client.DownloadString($"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={response}"); 

要這樣:

var result = client.DownloadString(string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", secretKey, response)); 
+0

請再次閱讀問題。問題在於:var response = Request [「g-recaptcha-response」]; 錯誤信息的第一行提到問題 –

+0

對不起,誤讀。檢查我的答案更新。 – Kyle

+0

Web Api 2中沒有表單請求 –