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服务的响应,然后将其转换为文件结果?任何帮助将不胜感激!
答案 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结果。