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

.NET Core接口返回音频文件失败并抛出ReadTimeout异常求助

问题解决方法

1. 修复ReadTimeout异常问题

FileStream的ReadTimeout属性仅适用于异步流场景,在同步流上访问该属性会直接抛出InvalidOperationException。解决核心是规范流的生命周期管理,避免无效的属性访问:

  • 用using语句包裹文件流,确保流使用后被正确释放,避免资源泄漏
  • 可改用File.OpenRead()方法创建流,它会返回默认配置的可读流,减少手动配置的错误

2. 修复接口仅返回内容长度、无音频数据的问题

该问题大概率是文件路径错误或流未正确处理导致:

  • 修正路径格式:代码中的"...//"不是有效的相对路径,Windows系统用"../"表示上一级目录,推荐直接使用绝对路径避免歧义
  • 优先使用PhysicalFileResult替代FileStreamResult,它会自动处理文件流的打开与释放,逻辑更简洁可靠

修正后的代码示例

[HttpPost("text-to-speech")]
[Produces("audio/mpeg")]
public IActionResult TextToSpeech()
{
    // 替换为实际的正确文件路径
    string filePath = @"C:\YourAudioDir\845d84df-43ef-4949-882d-81c323cda6a3.mp3";
    
    // 先检查文件是否存在,提前拦截异常
    if (!System.IO.File.Exists(filePath))
    {
        return NotFound("音频文件不存在");
    }
    
    // 使用PhysicalFileResult自动处理文件流
    return PhysicalFile(filePath, "audio/mpeg");
}

可选优化方案(若需手动管理流)

如果必须使用FileStreamResult,一定要用using包裹流确保资源释放:

[HttpPost("text-to-speech")]
[Produces("audio/mpeg")]
public async Task<IActionResult> TextToSpeech()
{
    string filePath = @"C:\YourAudioDir\845d84df-43ef-4949-882d-81c323cda6a3.mp3";
    if (!System.IO.File.Exists(filePath))
    {
        return NotFound("音频文件不存在");
    }
    
    using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    return new FileStreamResult(fileStream, "audio/mpeg");
}

额外建议

  • 不要硬编码文件路径,将路径配置到appsettings.json中,便于后续维护
  • 添加异常捕获逻辑,处理文件读取时的权限不足、文件损坏等异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:53:23