ASP.Net Core Web Api中的异步视频流不起作用
|
我之前使用过 http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/这种技术,并且非常适合异步视频流. 但对于ASP.NET Core,这种方式并没有按预期工作. 通过视频流类是: public class VideoStream
{
private readonly string _filename;
public VideoStream(string filename)
{
_filename = filename;
}
public async Task WriteToStream(Stream outputStream,HttpContent content,TransportContext context)
{
try
{
var buffer = new byte[65536];
using (var video = File.Open(_filename,FileMode.Open,FileAccess.Read))
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer,Math.Min(length,buffer.Length));
await outputStream.WriteAsync(buffer,bytesRead);
length -= bytesRead;
}
}
}
catch (Exception)
{ return; }
finally
{
outputStream.Flush();
outputStream.Dispose();
}
}
}
我对视频流请求有以下操作: [HttpGet]
[Route("[action]")]
public IActionResult GetVideo(int id)
{
var fileName = GetVideoFileName(id);
var video = new VideoStream(fileName);
var response = new HttpResponseMessage
{
Content = new PushStreamContent(video.WriteToStream,new MediaTypeHeaderValue("video/mp4"))
};
var objectResult = new ObjectResult(response);
objectResult.ContentTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("video/mp4"));
return objectResult;
}
由于默认情况下Asp.Net Core没有内置的Media Formatter for video / mp4我创建了以下自定义媒体格式化程序 public class VideoOutputFormatter : IOutputFormatter
{
public bool CanWriteResult(OutputFormatterCanWriteContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
return true;
}
public async Task WriteAsync(OutputFormatterWriteContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
var response = context.HttpContext.Response;
response.ContentType = "video/mp4";
How to impelemnt ???
}
}
并将以下行添加到Startup.cs services.AddMvc(options =>
{
options.OutputFormatters.Add(new VideoOutputFormatter());
});
它实际上调用我的自定义格式化程序 解决方法查看Asp.NET Core的源代码真的帮助我找到了这个的答案.他们有一个 StreamOutputFormatter级别,非常接近您想要使用的级别.我只需要修改它来寻找PushStreamContent,它就像一个魅力.这是我完整的VideoOutputFormatter: public class VideoOutputFormatter : IOutputFormatter
{
public bool CanWriteResult(OutputFormatterCanWriteContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (context.Object is PushStreamContent)
return true;
return false;
}
public async Task WriteAsync(OutputFormatterWriteContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
using (var stream = ((PushStreamContent)context.Object))
{
var response = context.HttpContext.Response;
if (context.ContentType != null)
{
response.ContentType = context.ContentType.ToString();
}
await stream.CopyToAsync(response.Body);
}
}
}
您不希望将HttpResponseMessage包装在控制器中的ObjectResult中,而是将PushStreamContent对象推送到ObjectResult中.您仍然需要在ObjectResult上设置MediaTypeHeaderValue. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何将MVC路由添加到特定控制器?
- 经典ASP和UTF-8
- asp.net-mvc-4 – 工作单元和通用存储库与实体框架5
- ASP.Net将用户数据存储在验证Cookie中
- asp.net-mvc – 发布MVC应用程序VS2013时未包含字体文件
- asp.net-mvc-3 – StringLength属性行为
- asp.net-mvc – ASP.NET MVC – ModelState.IsValid是false
- asp.net-mvc-3 – 为MVC3应用程序配置Ninject的正确方法是什
- asp.net – 我应该花费我的努力实现knockoutjs或查看jQuery
- ASP.Net Core Web Api中的异步视频流不起作用
- asp.net-mvc – 使用ASP.NET MVC中绝对路径访问视
- 使用ASP.net MVCJQuery将HTML标签(代码)作为字符
- asp.net – Orchard CMS Media中的文件大小上传限
- asp.net-mvc – 不要在ASP .NET MVC 4 BundleCon
- asp.net-mvc – 有什么技巧/技巧使用亚音速与Asp
- asp.net – 更好的方式来获取页面名称
- asp.net-mvc – ASP.NET MVC 4邮政编码验证
- asp.net-core-mvc – 如何在Asp.Net Core MVC 1.
- 在ASP.NET中如何识别/处理404异常?
- asp.net – 实体框架:“底层提供商在Open上失败
