iis 摄像头流与ASP.NET核心7 Web API缓冲/口吃,有什么办法可以改善?

np8igboo  于 2023-10-19  发布在  .NET
关注(0)|答案(1)|浏览(122)

我们有一个在Windows Server上运行的.NET 7应用程序,它使用IIS将摄像头的提要返回到前端,但与服务器上的Chrome中查看的原始输出相比,返回的流非常断断续续。
是否有任何额外的更改,可以在IIS中的代码或配置,可以使它运行更流畅?
从服务器上的Chrome中的原始相机URL观看流工作得很顺利,所以它看起来像是.NET处理流的问题。
这是我们迄今为止返回的方式:

[HttpGet("{cameraId}")]
public async Task<ActionResult> StreamCamera(int cameraId)
{
    var camera = _context.Cameras.FirstOrDefault(item => item.Id == cameraId);

    if (camera == null)
    {
        return NotFound($"No camera found for id {cameraId}");
    }

    using var stream = await httpClient.GetStreamAsync(camera.cameraUrl);

    Response.ContentType = "multipart/x-mixed-replace; boundary=myboundary";

    await stream.CopyToAsync(Response.Body);

    return new HttpStatusCodeResult(200);
}

然后,在前端使用img

<img src="/api/camera/1" />
n3ipq98p

n3ipq98p1#

找出一个可能的答案,在Get请求的开始,我使用HttpContext特性中的DisableBuffering方法,现在返回的流是平滑的,没有延迟/缓冲。
不知道这是最好的方法还是正确的地方,但它已经解决了这个问题。

var features = HttpContext.Features.Get<IHttpResponseBodyFeature>();
    features?.DisableBuffering();
[HttpGet("{cameraId}")]
public async Task<ActionResult> StreamCamera(int cameraId)
{
    // Added this here
    var features = HttpContext.Features.Get<IHttpResponseBodyFeature>();
    features?.DisableBuffering();

    var camera = _context.Cameras.FirstOrDefault(item => item.Id == cameraId);

    if (camera == null)
    {
        return NotFound($"No camera found for id {cameraId}");
    }

    using var stream = await httpClient.GetStreamAsync(camera.cameraUrl);

    Response.ContentType = "multipart/x-mixed-replace; boundary=myboundary";

    await stream.CopyToAsync(Response.Body);

    return new HttpStatusCodeResult(200);
}

相关问题