在.Net中使用WebService的问题(ReCaptcha)
-
05-07-2019 - |
题
我很难使用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,挑战和响应似乎很好。但是错误不断发生。
我很确定这是我如何请求服务的问题,因为这是我第一次真正使用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();
似乎在我得到回应的地方停滞不前。
有什么建议吗?
提前致谢
解决方案 2
因此得到了这个工作,出于某种原因我需要将请求写入如下的流:
//Write data to request stream
using (Stream requestSteam = request.GetRequestStream())
requestSteam.Write(byteData, 0, byteData.Length);
任何人都可以解释为什么会这样。我不认为我需要这样做,不完全理解幕后发生的事情......
其他提示
以前没有使用recaptcha服务,但我有两个故障排除建议:
- 使用Fiddler或Firebug并观察您向外发送的内容。验证参数可以帮助您进行基本的故障排除,即无效字符等。
- Recaptcha Wiki有条目关于处理Vista的开发。但它并不一定限于Vista;如果您的系统可以处理IPv6,那么您的浏览器可以默认以该格式进行通信。似乎Recaptcha处理IPv4。让Fiddler / Firebug工作可以告诉你那些可能导致你悲痛的其他参数。 醇>
这可能无法解决您的问题,但它可能会为您提供更好的故障排除信息。
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变量写入请求时略有不同,但它的核心是相同的。
不隶属于 StackOverflow