构建HTTP Post方法的方法,以免被防火墙阻止

时间:2014-02-05 20:38:33

标签: c# authentication http-post

自我们的软件测试版推出以来,我们遇到的一个问题是,由于发生某些事情,并非所有用户都能够通过身份验证(我们使用网络请求进行身份验证)。我们不确定是什么导致它,但我们有点确信它是由我们的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结构是否存在“标准”,以便大多数设备/防火墙接受它?我们使用正确的端口吗?

1 个答案:

答案 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);
};