我正在 .NET 8 中构建一个 API,当调用该 API 时,它将连接到后端的 IP 摄像头并将内容 (mjpeg) 流式传输到客户端的浏览器。
我不确定如何正确执行此操作,但我在下面得到了可以在 Kestrel/Visual Studio 上运行的代码。
但是,当我在 IIS 10 上托管我的应用程序时,事情变得很奇怪。 客户端会连接到服务器,但视频不会显示。
使用 DevTools 我可以看到请求将冻结在“从服务器下载”状态。如果我在后端手动终止与 IP 摄像机的连接,浏览器将快速显示流中的几帧,并且请求将完成。
除了此代码之外,我还尝试将 IP 摄像机流读入缓冲区,然后将其写入响应正文。但是,它仅适用于 Kestrel,不适用于 IIS。我想知道是否需要在 IIS 上进行一些配置?我已经为此工作了几个星期,但我没有想法。
服务器端
public async Task<Stream> Video()
{
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
string baseAddress = "http://192.168.1.100";
string clientId = "Username";
string clientSecret = "Password";
var credCache = new CredentialCache
{
{ new Uri(baseAddress), "Digest", new NetworkCredential(clientId, clientSecret) }
};
HttpClient httpClient = new HttpClient(new HttpClientHandler { Credentials = credCache });
httpClient.BaseAddress = new Uri(baseAddress);
var response = await httpClient.GetStreamAsync("/cgi-bin/mjpg/video.cgi?channel=1&subtype=1");
HttpContext.Response.Headers.ContentType = "multipart/x-mixed-replace; boundary=--myboundary";
return response;
}
HTML
<div class="col-md-4">
<img height="480" width="640" src="/Video">
</div>
我遇到了同样的问题,当我禁用响应正文缓冲时它得到了修复:
var responseBodyFeature = context.Features.Get<IHttpResponseBodyFeature>();
if (responseBodyFeature != null) responseBodyFeature.DisableBuffering();
请注意,当您在标头中定义边界值时,边界值不应以双连字符开头,因此它应如下所示:
"multipart/x-mixed-replace; boundary=myboundary"