通过MVC操作隧道Web API视频流响应

时间:2016-03-22 12:40:41

标签: asp.net-mvc api asp.net-web-api asp.net-mvc-5 asp.net-web-api2

http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video

使用上面的链接,我创建了一个web api调用,如果我直接调用web api,它将返回视频并播放没有问题。在生产中,web api调用将在防火墙后面,而不是公众可直接访问。由于原因太长,我无法向面向公众的网站添加web api服务。

我想通过MVC操作将调用隧道传输到视频,并将web api控制器的确切结果返回给用户。 Web api返回一个HttpResponseMessage,所以我使用下面的代码,认为我可以通过隧道来完成,但它似乎并没有起作用。

public HttpResponseMessage Play(string fileName)
{
    using (var client = new HttpClient())
    {
        var userName = Impersonation.Instance.CurrentImpersonatedUser;
        var url = string.Format("{0}/api/Player/Play?f={1}",
                                                this.pluginSettings["VirtualVideoTrainingServiceURL"],
                                                fileName);
        var result = client.GetAsync(url).Result;
        return result;
    }
}

当我调用MVC操作时,我只是在浏览器中看到它。 Result 我认为它以某种方式对数据进行序列化,但我无法证明或否定该理论。我是否需要解析来自Web服务的响应,然后将其转换为文件结果?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

WebAPI处理程序将响应组合成标题,内容和其他参数,并根据Http规范和与服务的客户/消费者的内容协商发送给用户。

另一方面,您可以从服务中获取JSON内容并将其传递给MVC Action。

您可以使用HttpResponseMessage

获取object<HttpResponseMessage>.Content中返回的内容

MVC利用IActionResult(由System.Web.Mvc.Controller使用)来组成执行的操作方法的结果,WebAPI的System.Web.Http.ApiController使用IHttpActionResult来组成输出。

答案 1 :(得分:0)

好的,我找到了答案。

http://www.dotnetcurry.com/aspnet-mvc/998/play-videos-aspnet-mvc-custom-action-filter

警告:需要清理下面的代码。

以此为例,我创建了一个名为VideoResult的ActionResult,它看起来像

private byte[] Buffer = null;
private string FileName = string.Empty;
private ContentRangeHeaderValue Range = null;
private string Length = string.Empty;

public VideoResult(byte[] buffer, string fileName, ContentRangeHeaderValue range, string length)
{
     this.Buffer = buffer;
     this.FileName = fileName;
     this.Range = range;
     this.Length = length;
}

/// <summary>
/// The below method will respond with the Video file
/// </summary>
/// <param name="context"></param>
public override void ExecuteResult(ControllerContext context)
{
     //The header information
     context.HttpContext.Response.StatusCode = (int)HttpStatusCode.PartialContent;
     if (this.Range != null)
     {
          context.HttpContext.Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", this.Range.From, this.Range.To, this.Range.Length));
     }
     context.HttpContext.Response.AddHeader("Content-Type", "video/mp4");
     context.HttpContext.Response.AddHeader("Content-Length", this.Length);
     context.HttpContext.Response.BinaryWrite(Buffer);
}

我从StreamContent(或PushStreamContent)中将内容中的字节数组作为ByteArray检索,并将该数据传递到上面的VideoResult中。

    var sc = ((StreamContent)result.Content).ReadAsByteArrayAsync();
    return new VideoResult(sc.Result, fileName, result.Content.Headers.ContentRange, 
result.Content.Headers.ContentLength.ToString());

这也允许用户搜索视频。我希望直接通过Web服务传递结果,但如上所示,响应太不同,因此需要转换为MVC Action结果。