部署到 Azure 时,具有 mimeType 音频/mpeg 的 FileStreamResult 不播放流

问题描述 投票:0回答:1

有一个通过 HTTP 和自定义端口发布的在线广播(例如 http://44.44.44.44:56/stream/1),我需要实现一个代理,在没有自定义端口的情况下通过 HTTPS 公开相同的广播流(例如 https://coolradio.azurewebsites.net/api/radio/AzureStream

我已经实现了

dotnet 6
Web API,它在本地运行时可以工作:

public async Task<IActionResult> AzureStream()
{
    var sourceUrl = "http://44.44.44.44:56/stream/1"
    var mimeType = "audio/mpeg";
    var client = new HttpClient();
    var sourceStream = await client.GetStreamAsync(sourceUrl);
    var fileStreamResult = new FileStreamResult(sourceStream, mimeType);
    return fileStreamResult;
}

当我将其作为 Web 应用程序发布到 Azure 时,我可以访问我的其他控制器和这个控制器,但它不会执行任何操作,并且浏览器呈现的图片略有不同,尽管 HTTP 响应、标头和流是相同的:

如何实现此代理,以便将其发布到 Azure 并通过 HTTPS 公开无线电?

azure audio-streaming filestreamresult
1个回答
0
投票

我无法谈论Azure实施方面的问题,所以也许有人可以给你更好的答案。但是,我可以总体上帮助您解决这个问题。

当我将其作为 Web 应用程序发布到 Azure 时,我可以访问我的其他控制器和这个控制器,但它不会执行任何操作,并且浏览器呈现的图片略有不同,尽管 HTTP 响应、标头和流是相同的:

这并不完全正确。

从代理发送的流数据在大约 13 KB 左右后停止,这就是无法播放的原因。您可以使用

curl -vvv
看到这一点。

源流是SHOUTcast服务器,不支持分块传输编码。对于传统兼容性,这些流媒体服务器几乎都没有这样做。我怀疑 .NET 6 HttpClient 的作者对 HTTP/1.0 风格的响应感到困惑,其中没有

Content-Length
响应标头,而且也没有传输编码。我怀疑它假设分块传输。

如果可能,您的服务器可以只处理连接的 TLS 端并透明地代理 HTTP 请求/响应,根本不解释 HTTP。

如果您的堆栈无法做到这一点,您仍然可以创建自己的轻量级 HTTP 客户端,连接到源流,然后将流数据中继回您的客户端。也就是说,您的服务器仍然接收 HTTPS 请求,但响应数据来自常规 TCP 套接字连接。

© www.soinside.com 2019 - 2024. All rights reserved.