分块读取文件流遇System.InvalidOperationException错误求助
分块读取文件流时出现Stream超时不支持错误
我尝试以1MB块的形式读取文件流来优化前端文件加载速度,但后端控制器抛出了如下异常:
System.InvalidOperationException: Timeouts are not supported on this stream. at System.IO.Stream.get_ReadTimeout() at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
控制器代码如下(Debug输出显示返回的是ApplicationName.Shared.ITEMStreamBlock类型对象):
var result = await itemRepository.GetFile(fileName, offset, blobLengthRemaining); System.Diagnostics.Debug.WriteLine(result); // 输出ApplicationName.Shared.ITEMStreamBlock return result;
问题原因
System.Text.Json在序列化包含Stream属性的自定义对象时,会自动尝试访问该Stream的ReadTimeout属性,但部分Stream类型(比如云Blob存储返回的流)并不支持超时属性,因此触发此异常。
解决方案
方案1:直接返回流结果(推荐)
不要返回包含Stream的自定义对象,而是直接返回ASP.NET Core提供的FileStreamResult,跳过Json序列化操作:
var result = await itemRepository.GetFile(fileName, offset, blobLengthRemaining); // 根据实际文件类型设置Content-Type,示例为二进制流 return File(result.Stream, "application/octet-stream", fileName);
方案2:修改自定义类的序列化行为
如果必须返回ITEMStreamBlock对象,需要在类中标记Stream属性不参与Json序列化:
using System.Text.Json.Serialization; public class ITEMStreamBlock { // 保留其他业务属性 public string FileId { get; set; } // 排除Stream属性的Json序列化 [JsonIgnore] public Stream Stream { get; set; } }
后续可单独返回流数据,或把元数据与流分开处理。
注意事项
- 确保返回的Stream未被提前关闭,若Repository未处理流生命周期,建议用
using语句管理。 - 若实现分块下载,需在响应头中设置
Content-Range等字段,配合前端完成断点续传逻辑。
内容的提问来源于stack exchange,提问作者Sarahrb
相关产品推荐
相关产品推荐

