代码之家  ›  专栏  ›  技术社区  ›  Natalie Perret

如何使用ASP.NET MVC进行异步/等待视频流?

  •  2
  • Natalie Perret  · 技术社区  · 6 年前

    最近我读了这篇文章( https://blogs.ibs.com/2017/01/24/streaming-video-content-to-a-browser-using-web-api

    本文中提供的解决方案工作得很好,但我想知道是否有异步/等待替代方案,因为本文只展示了围绕 HttpResponseMessage

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nkosi    6 年前

    在性能方面应该没有问题。

    使用async await并不能提供很多改进。这个 FileStreamer 正在利用异步操作访问文件流。

    如果坚持使用async await,可以考虑在 Task.Run 让行动返回 Task<HttpResponseMessage> .

    这里真的不需要过早的优化。

    例如

    public async Task<IHttpActionResult> Get(string filename) {
    
        var filePath = await GetFilePathAsync(filename);
        if (!File.Exists(filePath))
            return NotFound();
    
        var response = getResponse(filePath);
    
        return ResponseMessage(response);
    }
    
    private HttpResponseMessage getResponse(string filePath) {
        var response = Request.CreateResponse();
        response.Headers.AcceptRanges.Add("bytes");
    
        var streamer = new FileStreamer();
        streamer.FileInfo = new FileInfo(filePath);
        response.Content = new PushStreamContent(streamer.WriteToStream, GetMimeType(filePath));
    
        RangeHeaderValue rangeHeader = Request.Headers.Range;
        if (rangeHeader != null) {
            long totalLength = streamer.FileInfo.Length;
            var range = rangeHeader.Ranges.First();
            streamer.Start = range.From ?? 0;
            streamer.End = range.To ?? totalLength - 1;
    
            response.Content.Headers.ContentLength = streamer.End - streamer.Start + 1;
            response.Content.Headers.ContentRange = new ContentRangeHeaderValue(streamer.Start, streamer.End,
                totalLength);
            response.StatusCode = HttpStatusCode.PartialContent;
        } else {
            response.StatusCode = HttpStatusCode.OK;
        }
        return response;
    }