0

C#/.Net 3.5 を使用して reCaptcha Web サービスを使用するのに問題があります。問題は一般的にWebサービスを消費することだと思いますが。

String validate = String.Format("http://api-verify.recaptcha.net/verify?privatekey={0}&remoteip={1}&challenge={2}&response={3}", PrivateKey, UserIP, Challenge, Response);
WebClient serviceRequest = new WebClient();
serviceRequest.Headers.Add("ContentType","application/x-www-form-urlencoded")

String response = serviceRequest.DownloadString(new Uri(validate ));

エラーが nverify-params-incorrect であることを私に伝え続けます。つまり:

/verify へのパラメーターが正しくありませんでした。必要なすべてのパラメーターを渡していることを確認してください。

しかし、それは正しいです。秘密鍵を使用しています。IP アドレス (ローカル) は 127.0.0.1 で、チャレンジとレスポンスは問題ないようです。ただし、エラーが発生し続けます。

Webサービスと.Netを実際に使用したのはこれが初めてなので、これはサービスのリクエスト方法に問題があると確信しています。

データが確実に投稿されるように、これも試しました:

    String queryString = String.Format("privatekey={0}&remoteip={1}&challenge={2}&response={3}",PrivateKey, UserIP, Challenge, Response);
    String Validate = "http://api-verify.recaptcha.net/verify" + queryString;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(Validate));
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = Validate.Length;


    **HttpWebResponse captchaResponse = (HttpWebResponse)request.GetResponse();**
    String response;
    using (StreamReader reader = new StreamReader(captchaResponse.GetResponseStream()))
        response = reader.ReadToEnd();

応答が得られた時点で失速しているようです。

何かアドバイス?

前もって感謝します

4

3 に答える 3

0

これまで recaptcha サービスを使用したことはありませんが、トラブルシューティングに関する推奨事項が 2 つあります。

  1. Fiddler または Firebug を使用して、送信内容を監視します。パラメータを確認すると、無効な文字などの基本的なトラブルシューティングに役立ちます。
  2. Recaptcha Wiki には、 Vista での開発の取り扱いに関するエントリがあります。ただし、Vista に限定する必要はありません。システムがIPv6を処理できる場合、ブラウザはデフォルトとしてその形式で通信している可能性があります. あたかも Recaptcha が IPv4 を扱っているように見えます。Fiddler/Firebug が機能していれば、悲しみの原因となっている可能性のある他のパラメーターについて知ることができます。

これは問題の解決には役立たないかもしれませんが、より良いトラブルシューティング情報が得られる可能性があります。

于 2009-09-14T04:34:44.237 に答える
0

もちろん、ダミアンの答えは正しいですが、物事の順序を明確にするために(少し混乱しました)、完全なコードサンプルを用意するために...

var uri = new Uri("http://api-verify.recaptcha.net/verify"); 

var queryString = string.Format(
    "privatekey={0}&remoteip={1}&challenge={2}&response={3}", 
    privateKey, 
    userIP, 
    challenge, 
    response);

var request = (HttpWebRequest)HttpWebRequest.Create(uri);

request.Method = WebRequestMethods.Http.Post;
request.ContentLength = queryString.Length;
request.ContentType = "application/x-www-form-urlencoded";

using (var writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(queryString);
}

string result;
using (var webResponse = (HttpWebResponse)request.GetResponse())
{
    var reader = new StreamReader(webResponse.GetResponseStream()); 
    result = reader.ReadToEnd();
}

ポスト変数をリクエストに書き込んでいる点が少し違いますが、核心は同じです。

于 2012-02-13T19:04:14.223 に答える
0

これでうまくいきました。何らかの理由で、次のようにリクエストをストリームに書き込む必要がありました。

//Write data to request stream 
        using (Stream requestSteam = request.GetRequestStream())
            requestSteam.Write(byteData, 0, byteData.Length);

なぜこれが機能するのか、誰でも説明できますか。私はこれを行う必要があるとは思いませんでした.舞台裏で何が起こっているのか完全には理解していません..

于 2009-09-14T10:15:46.597 に答える