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

分块读取文件流遇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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:19