選択した選択肢に応じて基本的な製品レイアウト ドキュメントを提供する現在の会社用のツールを更新しています。最近、ある種のボットがツールボックスを定期的に攻撃しているようです。会社との話し合いの結果、ツールボックスを構築した後、ReCaptcha ツールをページに追加することにしました。
ツールボックスのセットアップ方法は、Json や MVC を使用しない ASP.net です (ツールボックスは、私がチームに参加するずっと前に構築された、かなり古いものです)。ReCaptcha ツールの追加は問題ではありませんでした。window.onload 関数を使用し、その指示に従って、プラグインなしで実行しました。これはすべて options.aspx ページで行われました。ReCaptcha 呼び出しのコードは options.aspx.cs ページにあります。
このコードに到達するために、フォームが通常送信される場所で AJAX 呼び出しを実行しようとしています。
問題: 各 AJAX 呼び出しはページの HTML を返し、ページ メソッド (VerifyReCaptcha) はブレーク ポイントがあるとトリガーされません。すべてのリストを実行するメソッドを呼び出してから、成功したかどうかを示す文字列を返すだけです。入力する dataType または contentType (存在する場合)、または POST または GET として実行するかどうかは問題ではないようです。
ajax 呼び出しの関数を呼び出すボタンのコードを次に示します。
<input type="button" id="DownloadLayoutButton" value="Download Layout" class="navigationButton" style="width: 200px; height: 24px;" />
呼び出される関数は次のとおりです。
$("#DownloadLayoutButton").click(function () {
$.ajax(
{
url: "options.aspx/VerifyReCaptcha",
dataType: "text",
data: {
challenge: Recaptcha.get_challenge(),
response: Recaptcha.get_response()
},
type: "POST",
success: function (result) {
if (result == "Success") {
alert("Success!");
else
alert("ReCaptcha entry was incorrect!");
},
error: function (request, status, error) {
alert("Error!");
}
});
});
このコードは、options.aspx.cs ページにある VerifyReCaptcha() メソッドにヒットすることはないようです。メソッドは次のとおりです。述べたように、この機能が単独で機能することをテストして確認しました。以前はブール値を返すようにしていましたが、ajax はブール値を扱うことができないため、結果に応じて「成功」または「失敗」を返すように変更しました。
[WebMethod]
public static string VerifyReCaptcha(string challenge, string response)
{
try
{
string PRIVATE_KEY = "MY_KEY_HERE";
string remoteip = HttpContext.Current.Request.UserHostAddress;
WebRequest request = WebRequest.Create("http://www.google.com/recaptcha/api/verify");
byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(String.Format("privatekey={0}&remoteip={1}&challenge={2}&response={3}", PRIVATE_KEY, remoteip, challenge, response));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = dataBytes.Length;
request.GetRequestStream().Write(dataBytes, 0, dataBytes.Length);
String resultString = String.Empty;
String errorString = String.Empty;
using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
{
resultString = sr.ReadLine();
errorString = sr.ReadLine();
}
Boolean b;
b = Boolean.TryParse(resultString, out b) && b;
if (b)
return "Success";
else
return "Failure";
}
catch (Exception)
{
return "Failure";
}
}
aspx ページは次のソースを使用しています。
<script type="text/javascript" src="JS/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="JS/jquery-validate/jquery.validate.js"></script>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>