我正在为我当前的公司更新一个工具,该工具根据选择的选项提供基本的产品布局文档。最近似乎某种类型的机器人定期点击工具箱,经过与公司的一些讨论,我们构建了工具箱,我们决定将ReCaptcha工具添加到页面中。
工具箱的设置方式是ASP.net,不使用Json或MVC(工具箱是一个公平的几年,在我加入团队之前很久就建立了)。添加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不能与布尔值一起使用,我根据结果将其更改为“Success”或“Failure”。
[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>
答案 0 :(得分:2)
您的ASP.NET AJAX页面方法必须是static
。
你有:
public virtual string VerifyReCaptcha()
需要:
public static virtual string VerifyReCaptcha()
注意:请阅读Why do ASP.NET AJAX page methods have to be static?以获取更多信息。
答案 1 :(得分:0)
据我了解,asp.net WebMethods期望在JSON中发布数据。
在您的JavaScript jQuery Ajax调用中使用dataType: "json"
而不是dataType: "text"
。
我还添加contentType: "application/json; charset=utf-8"
作为另一种选择。
如果未找到所需的格式正确的数据,则不会调用WebMethod。