2

選択した選択肢に応じて基本的な製品レイアウト ドキュメントを提供する現在の会社用のツールを更新しています。最近、ある種のボットがツールボックスを定期的に攻撃しているようです。会社との話し合いの結果、ツールボックスを構築した後、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>
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 に答える