使用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
相关产品推荐
相关产品推荐

