【问题标题】:C# HttpWebResponse contentlength = -1 when file too largeC# HttpWebResponse contentlength = -1 当文件太大时
【发布时间】:2013-03-13 01:34:33
【问题描述】:

我从烂番茄网站获得了一个 json 格式的字符串。我的代码看起来像

HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.Method = "GET";
webRequest.ContentType = "application/json";

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    //Code I'm using the reader with
}

当我运行返回 1 - 4 部电影的电影搜索时,它工作正常。但是,如果我尝试获得 5 或更多的结果,它将不起作用。 webResponse 内容长度为 -1。当我返回 4 部电影的结果时,内容长度为 7,449。

【问题讨论】:

  • 是否返回 HTTP 状态码?
  • 到目前为止,我同意 spender 和 Alexei Levenkov 的两个答案。依靠 N # 部电影听起来很危险,因为无法保证每部电影的设定内容长度。因此,实现“读取整个流直到没有更多”的效果似乎是要走的路。或者,如果您可以保证每部电影的长度为 N,那么您可以每批次分批查询 N 部电影。

标签: c# httpwebrequest httpwebresponse


【解决方案1】:

当 contentLength 返回 -1 时,这很可能是因为在 chunked transfer encoding(或者可能是 http“0.9”)中返回了响应。因此,在传输开始时没有已知的内容长度。只需阅读您的StreamReader 直到最后,您将获得服务器发送给您的所有内容。

【讨论】:

  • 刚刚在 Fiddler 将非分块响应转换为流时发现了这一点——它将内容长度设置为 -1 并将传输编码设置为分块。
【解决方案2】:

预期行为 - 属性返回服务器设置的内容长度,因此如果未设置该标头,您将得到 -1(这可能是从服务器流式传输的大文件的行为)。

HttpWebResponse.ContentLength:

备注:ContentLength 属性包含随响应返回的 Content-Length 标头的值。如果响应中未设置 Content-Length 标头,则 ContentLength 设置为值 -1

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多