2

我正在为我当前的公司更新一个工具,该工具根据所选择的选项提供基本的产品布局文档。最近似乎某种机器人定期访问工具箱,在与公司讨论后,我们构建了工具箱,因为我们决定将 ReCaptcha 工具添加到页面。

工具箱的设置方式是 ASP.net,不使用 Json 或 MVC(工具箱已经有几年历史了,早在我加入团队之前就已经构建好了)。添加 ReCaptcha 工具不是问题,我在没有插件的情况下使用了 window.onload 函数并使用了他们的说明。这一切都在 options.aspx 页面上完成,ReCaptcha 调用的代码在 options.aspx.cs 页面中。

为了达到这个代码,我试图在通常提交表单的地方进行 AJAX 调用。

问题: 每个 AJAX 调用都返回页面的 HTML,当我有断点时,页面方法 (VerifyReCaptcha) 不会触发。我需要它来调用将完成所有列表的方法,然后简单地传回一个字符串,该字符串简单地说明它是否成功。我输入什么数据类型或内容类型(如果有的话),或者我是否将其作为 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>
4

2 回答 2

2

您的 ASP.NET AJAX 页面方法需要是static.

你有:

public virtual string VerifyReCaptcha()

它需要是:

public static virtual string VerifyReCaptcha()

注意:阅读为什么 ASP.NET AJAX 页面方法必须是静态的?了解更多信息。

于 2013-10-10T18:35:29.713 回答
0

据我了解,asp.net WebMethods 期望以 JSON 格式发布数据。在您的 JavaScript jQuery Ajax 调用中使用dataType: "json"而不是dataType: "text".

我还添加 contentType: "application/json; charset=utf-8"了另一个选项。

如果未找到所需格式正确的数据,则不会调用 WebMethod。

于 2013-10-10T19:30:40.170 回答