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 服务,但我有两个故障排除建议:

  1. 使用 Fiddler 或 Firebug 并观察您向外发送的内容。验证您的参数将帮助您进行基本故障排除,即无效字符等。
  2. Recaptcha Wiki 有一个关于处理 Vista 上的开发的条目。不过,它不必局限于 Vista。如果您的系统可以处理 IPv6,那么您的浏览器可能会默认以该格式进行通信。似乎 Recaptcha 处理的是 IPv4。让 Fiddler/Firebug 工作会告诉您可能导致您悲伤的其他参数。

这可能无助于解决您的问题,但可能会为您提供更好的故障排除信息。

于 2009-09-14T04:34:44.237 回答
0

所以让它工作了,出于某种原因,我需要将请求写入流,如下所示:

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

谁能解释为什么这有效。我不认为我需要这样做,不完全了解幕后发生的事情..

于 2009-09-14T10:15:46.597 回答
0

Damien 的回答当然是正确的,但只是为了弄清楚事情的顺序(我有点困惑)并有一个完整的代码示例......

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();
}

我将 post 变量写入请求中略有不同,但它的核心是相同的。

于 2012-02-13T19:04:14.223 回答