.NET6下Aspose.Pdf.Document.Save()写入MemoryStream抛异常求助
问题:.NET6下Aspose.Pdf.Document.Save()保存MemoryStream抛出超时异常
原本在.NET Core 3.1中正常运行的代码,升级到.NET6后,使用未更新版本的Aspose.Pdf调用Document.Save(MemoryStream)时抛出异常,异常信息如下:
memoryStream.ReadTimeout = 'finalStream.ReadTimeout' threw an exception of type System.InvalidOperationException'
The memoryStream stream is a MemoryStream, and MemoryStreams do not support timeouts.
已尝试过以下修复方案但未解决:
- 设置memoryStream的ReadTimeout属性
- 改用Aspose.Pdf.Document.Export()方法
- 调用flush()及设置stream.Position = 0
可复现代码:
using (var memoryStream = new MemoryStream()) using (var pdfDoc = new Aspose.Pdf.Document()) { // ... 文档内容处理逻辑 } pdfDoc.Save(memoryStream);
问题分析
- 代码作用域错误:原代码中
pdfDoc被包裹在using块中,块结束后对象已被释放,此时调用Save()属于操作已释放对象的错误行为。 - .NET6 Stream行为变更:.NET6对Stream的超时属性访问做了更严格的校验,旧版本Aspose.Pdf内部逻辑会尝试访问MemoryStream的
ReadTimeout/WriteTimeout属性,但MemoryStream本身不支持这两个属性,因此触发异常。
解决方案
方案1:修正代码作用域
将Save()调用移至using块内部,确保操作时pdfDoc处于有效状态:
using (var memoryStream = new MemoryStream()) using (var pdfDoc = new Aspose.Pdf.Document()) { // ... 文档内容处理逻辑 pdfDoc.Save(memoryStream); memoryStream.Position = 0; // 后续处理memoryStream,比如写入文件或输出 }
方案2:使用包装流规避超时属性访问
自定义一个继承自MemoryStream的包装类,重写超时属性避免抛出异常:
public class MemoryStreamWrapper : MemoryStream { public override int ReadTimeout { get; set; } public override int WriteTimeout { get; set; } }
使用时替换原MemoryStream:
using (var memoryStream = new MemoryStreamWrapper()) using (var pdfDoc = new Aspose.Pdf.Document()) { // ... 文档处理逻辑 pdfDoc.Save(memoryStream); }
方案3:升级Aspose.Pdf到兼容.NET6的版本
旧版本Aspose.Pdf未针对.NET6的Stream行为变化做适配,升级到官方标注支持.NET6的版本(如21.10及以后版本),可从根源解决该兼容性问题。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

