1

http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-VideoTunnel Web API ответ видеопоток через MVC действие

Используя ссылку выше я создал апи вызов веб, который будет возвращать видео и играть без каких-либо проблем, если я называю Web API напрямую. В процессе производства веб-api-вызов будет за брандмауэром и не будет непосредственно доступен для публики. И по причинам, которые слишком длинны, я не могу добавить службу веб-api на сайт, ориентированный на общественность.

Я хотел бы туннелировать вызов к видео с помощью действия MVC и вернуть пользователю результат точного результата от веб-контроллера 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 Я думаю, что это сериализует данные в некотором роде, но я не могу доказать или опровергнуть эту теорию. Нужно ли мне анализировать ответ из веб-службы, а затем преобразовывать его в результат файла? Любая помощь будет оценена!

ответ

0

Хорошо, я нашел ответ.

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

Внимание: код ниже должен быть очищен.

Используя это в качестве примера я создал ActionResult под названием VideoResult, который выглядит как

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); 
} 

я получить массив байтов из содержимого в качестве ByteArray из StreamContent (или PushStreamContent) и передать эти данные в VideoResult выше.

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

Это также позволяет пользователю искать видео. Я надеялся просто передать результат через веб-службу напрямую, но, как показано выше, ответы слишком разные, и поэтому их нужно будет преобразовать в результат действия MVC.

0

WebAPI Handler формирует ответ в заголовки, содержимое и другие параметры и который будет отправлен пользователю на основе спецификации Http и согласования контента с клиентом/потребителем услуги.

С другой стороны, вы можете просто получить содержимое JSON из сервиса и передать его через действие MVC.

Вы можете получить содержание, возвращенное в HttpResponseMessage используя object<HttpResponseMessage>.Content

MVC использует IActionResult (используемый System.Web.Mvc.Controller) для формирования результата метода действия выполняется, WebAPI-х System.Web.Http.ApiController использует IHttpActionResult сочинить выход.

+0

Для нормальной модели вы правы, но это будет возвращать потоковый поток файла, поэтому мне нужно избегать JSON. Действие MVC будет использоваться в атрибуте src элемента видео html. –

+0

Почему бы не добавить контроллер, который происходит из ApiController, а канал - для вывода на ваши клиенты? @RodneyPannell –

+0

Трудно объяснить, почему я не могу добавить контроллер WebAPI на общедоступный сайт, но ApiController не может использоваться на публичном сайте. Это не «обычный» сайт MVC. Обычно мы используем RestSharp для связи с веб-api за файловой стеной, но это совершенно другой сценарий, чем вытаскивание модели из базы данных. –