在 IIS 10 上使用 .NET 8 进行 Mjpeg 流传输

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

我正在 .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>
c# .net iis video-streaming kestrel
1个回答
0
投票

我遇到了同样的问题,当我禁用响应正文缓冲时它得到了修复:

var responseBodyFeature = context.Features.Get<IHttpResponseBodyFeature>();
if (responseBodyFeature != null) responseBodyFeature.DisableBuffering();

请注意,当您在标头中定义边界值时,边界值不应以双连字符开头,因此它应如下所示:

"multipart/x-mixed-replace; boundary=myboundary"
© www.soinside.com 2019 - 2024. All rights reserved.