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

.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);

问题分析

  1. 代码作用域错误:原代码中pdfDoc被包裹在using块中,块结束后对象已被释放,此时调用Save()属于操作已释放对象的错误行为。
  2. .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:12