【问题标题】:Return GetResponseStream output to another function , What about respone disposing将 GetResponseStream 输出返回到另一个函数,响应处置呢
【发布时间】:2012-11-14 13:33:24
【问题描述】:

我正在处理下载管理器项目 我正在使用:

public Stream GetStream(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    return response.GetResponseStream();
}

然后在while语句中使用返回的流作为输入流和FileStream作为输出流:

Stream InputStream = GetStream("http://test_url/test.zip");
Stream OutputStream = new FileStream("d:\\test.zip", FileMode.Create, FileAccess.Write));
do
{
    readSize = InputStream.Read(buffer, 0, buffSize);
    OutputStream.Write(buffer, 0, (int)readSize);
}
while (readSize > 0);

使用我的 256kpps 连接下载超过 50MB 的文件时 大约 20 - 30 MB 后,readSize 变为 0 且没有错误

我的问题是: Response 对象有什么问题,它被处理了吗???? 或者是什么问题?

提前谢谢你, 如果我不能更好地解释,我很抱歉。

【问题讨论】:

  • 你的问题是什么意思 - 是你的代码还是你正在运行的代码。如果您提供您正在使用的实际代码,会更容易提供帮助
  • 您需要发布实际代码,您提供的示例没有任何意义。为什么要尝试从响应流中读取?这是要写入的。
  • 嗨,我编辑了我的帖子,所以我认为现在很清楚,对于@steve-py:我认为响应流是为了阅读;
  • 您的代码可以处理较小的文件吗?

标签: c# getresponsestream


【解决方案1】:

您没有释放 HttpWebRequest / HttpWebResponse 对象,这可能会导致问题 - 对同一服务器的并发连接数存在内置限制。

你应该这样做:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using(Stream responseStream = response.GetResponseStream())
    {
        using(Stream outputStream = new FileStream(...))
        {
            responseStream.CopyTo(outputStream);
        }
    }
}

Stream.CopyTo 是 .NET 4.0 中的新功能。如果您使用的是 .NET write your own。

【讨论】:

  • 谢谢@Joe,但您在一个地方完成所有工作,我的问题是关于在另一个函数中拆分请求和响应,并在第二个地方使用它返回的流。关于处置:我实际上是这样做的,所以我担心响应流与它自己的响应分离,因此该流无法再读取。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2018-12-21
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多