【问题标题】:Cannot access closed file System.ObjectDisposedException无法访问已关闭的文件 System.ObjectDisposedException
【发布时间】:2017-06-19 10:19:22
【问题描述】:

我正在尝试从 WebAPI Rest Service 读取并返回文件内容,我正在 using.. 块内返回响应。我收到 System.ObjectDisposedException。有人可以帮我解决这个问题吗?

using (var fileStream = new FileStream(LocalFilePath, FileMode.Open))
            {
                response.Content = new StreamContent(fileStream);
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "MaxRecords.xls" };
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
                return response;
            }

【问题讨论】:

  • 那么不要使用“using”块?
  • 删除 using 块是否有效? response.Content 正在引用已处置的实例 (fileStream)。
  • @DaveBecker 是的,它在删除 using 块后可以工作。但我希望使用块来处理文件流:(
  • 不直接相关,但您是在创建真正的 Excel 文件还是通过返回扩展名为 xls 的 CSV 或 HTML 文件来伪造它?这肯定会导致客户问题。 xls 在过去 10 年中已过时。您可以使用像 EPPlus 这样的库非常轻松地创建一个真正的 XLSX 文件,没有虚假内容或在服务器上安装 Excel

标签: c# asp.net asp.net-web-api asp.net-web-api2 idisposable


【解决方案1】:

您需要创建一个流推送对象,该对象根据需要在线路上生成文件位。我自己建了一个,但我知道现在盒子里有一个——叫做PushStreamContent。这是一个非常简单的示例,does something similar 满足您的需求。

问题是,客户端需要关闭流,或者PushStreamContent 需要在写入所有字节后关闭它,但是使用using 块,您在发送时会立即关闭它。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多