簡體   English   中英

如何使用ASP.NET MVC異步/等待視頻流?

[英]How to do async / await video streaming with ASP.NET MVC?

最近,我閱讀了有關視頻流的這篇文章( https://blogs.ibs.com/2017/01/24/streaming-video-content-to-a-browser-using-web-api )。

文章中提供的解決方案效果很好,但我想知道是否存在任何異步/等待替代方案,因為本文僅顯示了圍繞HttpResponseMessage構建的解決方案,我擔心性能問題嗎?

性能上應該沒有問題。

使用異步等待不會帶來很多改進。 FileStreamer在訪問文件流時已經利用了異步操作。

如果您堅持使用異步等待,則可以考慮將動作的主體包裝在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM