自我们的软件测试版推出以来,我们遇到的一个问题是,由于发生某些事情,并非所有用户都能够通过身份验证(我们使用网络请求进行身份验证)。我们不确定是什么导致它,但我们有点确信它是由我们的POST请求引起的。下面是我们用来执行请求的C#方法。
public static string getResponse(string url, string postdata)
{
try
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postdata);
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
myHttpWebRequest.Method = "POST";
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.ContentLength = byte1.Length;
Stream newstream = myHttpWebRequest.GetRequestStream();
newstream.Write(byte1, 0, byte1.Length);
WebResponse response = myHttpWebRequest.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
catch
{
return "";
}
}
例如,也许我们没有以所有防火墙都接受它的方式构建它。
话虽如此,我们不知道这是端口问题,请求本身还是用户问题。有没有人曾经遇到过这个问题?你做了什么修复它?
您的POST
结构是否存在“标准”,以便大多数设备/防火墙接受它?我们使用正确的端口吗?
答案 0 :(得分:0)
我已更新我的catch
语句以捕获Web异常:
catch (WebException ex)
{
ex.writeToDebuggerOrTxtFile;
}
由于目前我们还不完全确定导致问题的原因,也就是说,我们不知道是用户,防火墙还是端口,导致用户无法进行身份验证,我们必须先隔离问题。如果状态代码返回类似HTTP 500,401,403等的内容,则表明该请求在服务器上失败。
编辑: 睡过这个时,我看到了这个问题的一些问题。
让我解释一下。
通常,即使状态代码可能返回指示错误的代码,所有HTTP响应也应该成功。我认为解决这个问题的正确方法是简单地看待抛出的WebException
(因为大多数“失败”的响应应该返回成功),但是也要纯粹看status code
s。
失败的响应仍然可以成功恢复响应标头,但我认为接近它的正确方法是查看状态码本身。
这是我编写的node.js脚本,用于检查HTTP响应标头:
var http = require("http");
var fs = require("fs");
var i = 0;
var hostNames = ['www.google.com'];
for (i; i < hostNames.length; i++){
var options = {
host: hostNames[i],
path: '/'
};
(function (i){
http.get(options, function(res) {
var obj = {};
obj.url = hostNames[i];
obj.statusCode = res.statusCode;
obj.headers = res.headers;
for(var item in res.headers){
obj.headers[item.replace(/\./,'\\')] = res.headers[item];
}
console.log(JSON.stringify(obj, null, 4));
}).on('error',function(e){
console.log("Error: " + hostNames[i] + "\n" + e.stack + "\n");
});
})(i);
};