内容长度始终为负数

时间:2015-09-02 20:39:12

标签: c# .net http httpwebrequest httpwebresponse

我不知道,但即使repsonse具有相同的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

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

enter image description here

怎么修好?

2 个答案:

答案 0 :(得分:3)

有几件事:

当我尝试时,stackoverflow.com没有设置Content-Length标头,所以它将以-1开始。

但是,更改URL以使用肯定设置Content-Length标头的服务器(例如www.theguardian.com)仍会产生相同的结果:-1。

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

如果您没有设置该属性,则ContentLength属性会正确显示。

答案 1 :(得分:0)

这意味着返回内容长度的是Fidder。 Fiddler这样做的原因是你按下了“Stream”按钮(或者其他一些东西表示你想要返回'Stream'或'Chunked'数据。

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

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

字面上刚刚经历了这个 - HTH!