内容长度始终为负
Content length is always negative
我不知道,但内容长度始终为负,即使响应具有正确的 Content-Length header。例如:
class Program
{
static void Main()
{
try
{
string result = Get("http://whosebug.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
但是在程序中我得到了这个:
如何修复?
几件事:
当我尝试时,whosebug.com 没有设置 Content-Length header,所以它会通过 -1。
但是,将 URL 更改为使用肯定会设置 Content-Length header 的服务器,例如 www.theguardian.com,仍然会产生相同的结果:-1 .
我认为这是你在 HttpWebRequest
object 上使用 AutomaticDecompression
。
如果您不设置 属性,ContentLength 属性 会正确显示。
这意味着 Fidder 正在 returning content-length。 Fiddler 这样做的原因是您按下了 'Stream' 按钮(或以其他方式向提琴手指示您想要 return 'Stream' 或 'Chunked' 数据。
当服务器 returns 'Chunked' 数据时,它将 content-length 设置为 -1 -- 你不知道内容的长度,因为你可以有无限的块.
如果您取消单击(或关闭)流式传输,则 fiddler return 将其默认 'buffered' 响应,这是来自服务器的响应的精确副本。这当然会包括 Content-Length header.
实际上只是经历了这个 -- HTH!
我不知道,但内容长度始终为负,即使响应具有正确的 Content-Length header。例如:
class Program
{
static void Main()
{
try
{
string result = Get("http://whosebug.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
但是在程序中我得到了这个:
如何修复?
几件事:
当我尝试时,whosebug.com 没有设置 Content-Length header,所以它会通过 -1。
但是,将 URL 更改为使用肯定会设置 Content-Length header 的服务器,例如 www.theguardian.com,仍然会产生相同的结果:-1 .
我认为这是你在 HttpWebRequest
object 上使用 AutomaticDecompression
。
如果您不设置 属性,ContentLength 属性 会正确显示。
这意味着 Fidder 正在 returning content-length。 Fiddler 这样做的原因是您按下了 'Stream' 按钮(或以其他方式向提琴手指示您想要 return 'Stream' 或 'Chunked' 数据。
当服务器 returns 'Chunked' 数据时,它将 content-length 设置为 -1 -- 你不知道内容的长度,因为你可以有无限的块.
如果您取消单击(或关闭)流式传输,则 fiddler return 将其默认 'buffered' 响应,这是来自服务器的响应的精确副本。这当然会包括 Content-Length header.
实际上只是经历了这个 -- HTH!