asp.net - 如何使用 ASP.NET MVC 进行异步/等待视频流?
问题描述
最近我阅读了这篇关于视频流的文章 ( https://blogs.ibs.com/2017/01/24/streaming-video-content-to-a-browser-using-web-api )。
文章中提供的解决方案效果很好,但我想知道是否有任何 async / await 替代方案,因为文章只显示了一个围绕它构建的解决方案HttpResponseMessage
并且我担心性能问题?
解决方案
性能方面应该没有问题。
使用 async await 不会带来太大的改进。已经在FileStreamer
访问文件流时利用了异步操作。
如果您坚持使用 async await,您可以考虑将操作的主体包装在 a 中Task.Run
并让操作返回 a 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;
}
推荐阅读
- hadoop - 如何重新平衡数据节点磁盘上的 HDFS 数据大小
- c# - 将位图转换为 png 图像并保存在数据库中
- algorithm - 将任意大小的圆圈放在另一个形状/平行四边形中
- maven - 是否可以使用 Maven 扩展插件隐式放置项目依赖项?
- python - matplotlib 中的图例问题,我使用颜色条
- java - 如何将java对象列表传递给oracle存储过程(不能使用Spring)
- android - 我有一个结算帐户,但我无法通过 Google 路线进行路线选择。我收到消息“REQUEST_DENIED”
- python-2.7 - 可变大小的消息
- java - 有没有办法多次执行 paintComponent() 中的代码?
- excel - 嵌套 For Each 和 If Then 语句有效,但不继续下一张表