代码之家  ›  专栏  ›  技术社区  ›  Damien

在.NET中使用WebService时出现问题(recaptcha)

  •  0
  • Damien  · 技术社区  · 16 年前

    我在使用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 ));
    

    它一直告诉我错误是:验证参数不正确。这意味着:

    要/验证的参数不正确,请确保传递了所有必需的参数。

    但这是正确的。我使用的是私钥,IP地址(本地)是127.0.0.1,挑战和响应看起来很好。然而,错误仍然在发生。

    我很确定这是我如何请求服务的问题,因为这是我第一次实际使用WebServices和.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();
    

    似乎在我得到回应的时候停滞不前了。

    有什么建议吗?

    提前谢谢

    3 回复  |  直到 14 年前
        1
  •  0
  •   jro    16 年前

    以前没有使用过recaptcha服务,但我有两个故障排除建议:

    1. 使用小提琴或Firebug,观察你发送的内容。验证您的参数将帮助您进行基本的故障排除,即无效字符等。
    2. 这个 Recaptcha Wiki has an entry 关于在Vista上处理开发。不过,它不必局限于Vista;如果您的系统可以处理IPv6,那么您的浏览器就可以作为默认格式进行通信。看起来好像recaptcha处理的是IPv4。让Fiddler/Firebug工作可以告诉你那些可能导致你悲伤的其他参数。

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

        2
  •  0
  •   Damien    16 年前

    因此,这项工作开始了,出于某种原因,我需要将请求写入这样的流:

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

    有人能解释一下为什么会这样吗?我不认为我需要这样做,不完全理解幕后发生了什么。

        3
  •  0
  •   Derek Morrison    14 年前

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

    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变量,但是它的核心是相同的。