【问题标题】:c# TcpClient Post returning empty resultsc# TcpClient Post 返回空结果
【发布时间】:2014-01-28 17:10:13
【问题描述】:

我有以下代码:

string url = "https://myurl.com/is/here/example?param1=100&param2=200";

string post = "POST " + url + " HTTP/1.1\r\n" +
              "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
              "Accept-Encoding: gzip, deflate\r\n" +
              "Accept-Language: en-US,en;q=0.5\r\n" +
              "Connection: keep-alive\r\n" +
              "Host: myurl.com\r\n" +
              "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0\r\n" +
              "Content-type: application/json\r\n" +
              "X-HTTP-Method-Override: GET\r\n" +
              "X-MY-CUSTOM-HEADER: headervalue\r\n\r\n";

TcpClient tcp = new TcpClient("myurl.com", 443);

string returnData = string.Empty;
using (SslStream stream  = new SslStream(tcp.GetStream()))
{
    //Authenticate here...

    byte[] data = Encoding.ASCII.GetBytes(post);

    stream.Write(data, 0, data.Length);
    stream.Flush();
    stream.ReadByte();

    data = new byte[4096];
    var n = stream.Read(data, 0, data.Length);

    using (MemoryStream ms = new MemoryStream(data, 0, n))
    {
        ms.ReadByte();
        ms.ReadByte();

        using (DeflateStream df = new DeflateStream(ms, CompressionMode.Decompress))
        using (StreamReader rd = new StreamReader(df))
        {
            returnData = rd.ReadToEnd();
        }
    }
}

tcp.Close();

但是,响应始终为空。帖子字符串是否正确?我在这里错过了什么?

编辑:

我正在使用 SslStream,它似乎正在检索数据。但是,有没有办法只读取直到收到所有数据而不是

【问题讨论】:

  • 您是否有理由尝试使用 TcpClient 来执行此操作,而不是使用原生与 HTTP(S) 通信的东西?
  • 不要自己动手,用HttpWebRequest
  • 我已经在使用 HttpWebRequest 并且工作正常。但是我想尝试使用 TcpClient 来查看是否存在性能差异。
  • 如果您可以使用TcpClient 编写比HttpWebRequest 实现的性能更高的代码,为什么该类的开发人员还没有这样做并将该实现放在HttpWebRequest 中?

标签: c# httpwebrequest tcpclient


【解决方案1】:

您似乎是通过 URL 的长度(以 UTF-8 表示时)声明内容的长度,而不是 post 正文中的任何内容

如果内容没有内容长度标头指示的那么长,我希望远程服务器等待其余的内容。

您还连接到端口 443,并且您的 URL 以“https”开头,但您似乎没有尝试进行 SSL 协商。

【讨论】:

  • 好的,Content-Length 标头是多余的,所以我删除了它。 SSL 协商是怎样的?
猜你喜欢
  • 2020-11-09
  • 2017-07-05
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多