You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回File结果时如何避免流被关闭?

解决System.ObjectDisposedException: Cannot access a closed Stream错误

问题原因

你的ToPdfStream()方法里,使用了using Stream stream = new MemoryStream();声明流。虽然调用pdfDocument.Save(stream, closeStream: false);时设置了不关闭流,但using语句块执行完毕后,会自动调用流的Dispose()方法释放资源,导致返回给控制器的流已经处于关闭状态,后续ASP.NET Core的File()方法尝试读取这个流时就会抛出该异常。

修复方案

修改ToPdfStream()方法,去掉using声明,直接创建MemoryStream并返回:

public Stream ToPdfStream()
{
    PdfDocument pdfDocument = new PdfDocument(generateUniqueDocumentIdentifiers: true);
    Bitmap innerBitmap = InnerBitmap;
    PdfPage pdfPage = pdfDocument.AddPage();
    pdfPage.Width = innerBitmap.Width;
    pdfPage.Height = innerBitmap.Height;
    pdfPage.TrimMargins.All = 0;
    DrawImage(XGraphics.FromPdfPage(pdfPage), innerBitmap, 0, 0);
    Stream stream = new MemoryStream(); // 移除using声明
    pdfDocument.Save(stream, closeStream: false);
    stream.Position = 0; // 确保流指针回到起始位置
    return stream;
}

补充说明

ASP.NET Core的File()方法在处理完流后,会自动负责释放流资源,所以不需要手动用using包裹流。返回前务必确认流的Position已经设为0,否则读取时会从流的末尾开始,导致返回空文件。


内容的提问来源于stack exchange,提问作者Yoda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:25:23