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

使用MemoryStream时触发ReadTimeout/WriteTimeout异常的技术求助

问题解决:MemoryStream 超时异常处理

核心原因

MemoryStream 本身不支持 ReadTimeout 和 WriteTimeout 属性,但 StreamContent 在内部会尝试访问这些属性,从而触发 InvalidOperationException。

解决方案

方案1:改用 ByteArrayContent 替代 StreamContent

将内存流中的数据转换为字节数组,用 ByteArrayContent 包装后发送,完全绕开流超时属性的访问问题,同时也能避免因流位置未重置导致的读取失败问题。

修改代码如下:

// 停止录音后添加这两行
stream.Position = 0; // 将流指针重置到起始位置,确保能读取到完整数据
var audioBytes = stream.ToArray();

// 替换原来的 StreamContent 为 ByteArrayContent
var fileContent = new ByteArrayContent(audioBytes);

方案2:自定义包装流屏蔽超时属性

如果必须使用 StreamContent,可以创建一个包装流,重写 ReadTimeout 和 WriteTimeout 属性,避免抛出异常:

public class NoTimeoutMemoryStream : MemoryStream
{
    public override int ReadTimeout { get => 0; set {} }
    public override int WriteTimeout { get => 0; set {} }
}

然后将原来的 MemoryStream stream = new MemoryStream(); 替换为:

NoTimeoutMemoryStream stream = new NoTimeoutMemoryStream();

额外注意事项

  • 无论使用哪种方案,都必须在读取流数据前调用 stream.Position = 0;,否则流指针停在数据末尾,会导致读取到空内容。
  • HttpClient 建议声明为静态成员并复用,避免频繁创建/释放连接(你的代码中已经这么做了,这点没问题)。

内容的提问来源于stack exchange,提问作者lingeringame

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:32:57