【问题标题】:Content length is always negative内容长度总是负数
【发布时间】:2015-09-02 20:39:11
【问题描述】:

我不知道,但即使响应具有正确的 Content-Length 标头,内容长度始终为负数。例如:

class Program
{
    static void Main()
    {
        try
        {
            string result = Get("http://stackoverflow.com/");
            Console.WriteLine("Response length = {0}", result.Length);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    static string Get(string adr)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(adr);
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0";
        req.Proxy = null;
        req.KeepAlive = false;
        req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
        req.AllowAutoRedirect = true;
        req.Timeout = 10000;
        req.ReadWriteTimeout = 10000;
        req.MaximumAutomaticRedirections = 10;
        req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        req.Method = WebRequestMethods.Http.Get;


        using (var response = (HttpWebResponse) req.GetResponse())
        {
            using (var stream = response.GetResponseStream())
            {
                if (stream == null)
                    throw new NullReferenceException("Response stream is nulL!");
                using (var reader = new StreamReader(stream, Encoding.Default))
                {
                    Console.WriteLine("Content length = {0}", response.ContentLength);
                    return WebUtility.HtmlDecode(reader.ReadToEnd());
                }
            }
        }
    }
}

fiddler 显示以下输出:

HTTP/1.1 200 OK
Date: Wed, 02 Sep 2015 20:36:42 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: private, max-age=0
Cf-Railgun: fe8c0e42fd 44.42 0.042796 0030 3350
X-Frame-Options: SAMEORIGIN
X-Request-Guid: bc3ccb1f-1de5-4375-b30d-f3c89134cf86
Server: cloudflare-nginx
CF-RAY: 21fc0233f6652bca-AMS
Content-Length: 251540

但是在程序中我得到了这个:

如何解决?

【问题讨论】:

  • 1) 当服务器响应中不存在 content-lenght 时,根据 MSDN 上的 Httpresponse.ContentLenght,它将为 -1 2) Fiddler 可能使用了与您类似的方法来获取实际计数,但您得到 240427 vs 251540 因为响应是 UTF-8 而 .Net 字符串是 UTF-16。这样的事情会在你的 Main() 中抛出 string.lenght

标签: c# .net http httpwebrequest httpwebresponse


【解决方案1】:

有几点:

当我尝试时,stackoverflow.com 没有设置 Content-Length 标头,因此它会以 -1 的形式出现。

但是,将 URL 更改为使用确实设置了 Content-Length 标头的服务器,例如 www.theguardian.com,仍然会产生相同的结果:-1。

我认为这是您在HttpWebRequest 对象上使用AutomaticDecompression

如果您不设置该属性,则 ContentLength 属性会正确通过。

【讨论】:

    【解决方案2】:

    这意味着返回内容长度的是 Fidder。 Fiddler 这样做的原因是您按下了“Stream”按钮(或以其他方式向 fiddler 表明您想要返回“Stream”或“Chunked”数据。

    当服务器返回“分块”数据时,它会将内容长度设置为 -1——您不知道内容的长度,因为您可以拥有无​​限的块。

    如果您取消单击(或关闭)流式传输,则 fiddler 会返回其默认的“缓冲”响应,这是来自服务器的响应的精确副本。哪个当然会包含 Content-Length 标头。

    实际上刚刚经历了这个——HTH!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2012-11-03
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多