返回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
相关产品推荐
相关产品推荐

