使用 multipart/x-mixed-replace 转发摄像头直播并不总是适用于 .net 6

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

这个问题可能与Forward multipart/x-mixed-replace livestream ASP.NET Core有关,但是虽然我的情况略有不同,但我提出了一个新问题。我已经遵循了 TS 从上述问题中提出的其他问题中的所有建议和其他问题/建议,但没有运气。

我的控制器使用 http 客户端从摄像头请求 RTSP 流,以将其提供给 api 使用者。从 .net core2 开始,这在所有系统上都可以正常工作。将所有代码升级/更新到 .net 6 后,camerastream 不再在所有系统上运行。某些系统(基于同一虚拟机)显示流,但其他系统则不显示。

到目前为止我做了什么:

  • 禁用身份验证/ssl 以便能够跟踪流
  • 捕获wireshark的所有请求 -- 在系统上,流不起作用,当我关闭/中止请求时,数据会打印在调试控制台中,看起来不错 -- 在系统上,流不工作,我曾经见过一次 IOException:流太长。这表明从与相机通信的 http 客户端到输出流的流复制不起作用,就好像它在复制到输出流之前进行了缓冲一样。但是,为什么它在某些系统上有效,而在其他系统上则不行...... -我添加了“EnableRangeProcessing”但没有结果。

控制器代码如下所示:

[ResponseCache(NoStore = true)]
public async Task<IActionResult> ImageStream(int cameraId, int maxfps = 30)
{
var stream = await _cameraService.GetCameraStreamAsync(cameraId, credentials, maxfps);

return new FileStreamResult(
  stream,
  "multipart/x-mixed-replace; boundary=\"myBoundary\"");
}

_cameraService:
public async Task<Stream> GetCameraStreamAsync(int cameraId, CameraCredentialsDto credentials, int maxFps)
        {
            var client = new HttpClient { BaseAddress = new Uri($"http://{credentials.IPaddress}") };
            client.SetBasicAuthentication(credentials.Username, credentials.Password);
            client.DefaultRequestHeaders.ExpectContinue = false;

            string relativeUrl = $"cameraSpecificURL";
            return await client.GetStreamAsync(relativeUrl);
        }

--更新

我比较了工作系统和非工作系统的请求标头,但从客户端来看,两个请求之间没有区别。

GET /appapi/v1/camera/1003/stream?maxfps=30&token=**redacted** HTTP/1.1
Host: ipaddress:5001
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,nl;q=0.8

返回的数据格式也正确,两个破折号位于新段的前面。此外,通过直接从系统上的摄像机请求流,该流不是由控制器提供的,来自摄像机的数据很好。

c# .net asp.net-core stream
1个回答
0
投票

嗯。想通了。这只是我的代码。我们有一些令人毛骨悚然的中间件(在开发中),它检查每个请求以用于记录目的并将主体的位置倒回至 0。通过删除这个中间件,它被修复了。

这个评论触发了我:FileStreamResult in ASP.NET core of a Large file (> 2 GB) results in System.IO.IOException: Stream was too long

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