1

http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-VideoTunnel Web API Video-Stream Antwort durch MVC Aktion

Über den Link oben ich eine Web-API-Aufruf erstellt, die ein Video und spielen ohne Probleme zurück, wenn ich die Web-api direkt aufrufen. In der Produktion wird der Web-API-Aufruf hinter einer Firewall und nicht direkt für die Öffentlichkeit zugänglich sein. Und aus Gründen, die viel zu lang sind, kann ich der öffentlich zugänglichen Website keinen Web-API-Dienst hinzufügen.

Ich möchte den Anruf zu einem Video durch eine MVC-Aktion tunneln und das genaue Ergebnis vom Web-API-Controller an den Benutzer zurückgeben. Web API gibt eine HttpResponseMessage zurück, also habe ich den unten stehenden Code verwendet und dachte mir, dass ich die Antwort einfach tunneln kann, aber es scheint überhaupt nicht zu funktionieren.

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

Wenn ich an den Aufruf der MVC-Aktion mache, bekomme ich das einfach im Browser. Result Ich denke, es ist die Serialisierung der Daten in irgendeiner Weise, aber ich bin nicht in der Lage, diese Theorie zu beweisen oder zu widerlegen. Muss ich die Antwort vom Webservice analysieren und sie dann in ein Dateiergebnis konvertieren? Jede Hilfe wäre willkommen!

Antwort

0

Ok, ich habe die Antwort gefunden.

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

Warnung: Code muss unten gereinigt werden.

Mit diesem als Beispiel habe ich eine Action VideoResult genannt, die

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

wie

sieht I das Byte-Array aus dem Inhalt als ByteArray- vom StreamContent (oder PushStreamContent) abzurufen und diese Daten in die VideoResult passieren über.

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

Dies ermöglicht dem Benutzer auch, das Video zu suchen. Ich hatte gehofft, das Ergebnis direkt aus dem Webservice zu übermitteln, aber wie oben gezeigt, sind die Antworten einfach zu unterschiedlich und müssen daher in ein MVC Action-Ergebnis umgewandelt werden.

0

Der WebAPI-Handler erstellt die Antwort in Kopfzeilen, Inhalt und anderen Parametern, die basierend auf der HTTP-Spezifikation und der Inhaltsverhandlung mit dem Client/Verbraucher des Dienstes an den Benutzer gesendet werden.

Auf der anderen Seite können Sie einfach JSON-Inhalte aus dem Dienst abrufen und über die MVC-Aktion übergeben.

Sie den Inhalt in den object<HttpResponseMessage>.Content

MVC System.Web.Http.ApiController das Ergebnis der Aktion-Methode zusammengeführt, WebAPI die Nutzung von IActionResult (verwendet von System.Web.Mvc.Controller) macht verwendet IHttpActionResult mit HttpResponseMessage zurück bekommen kann die Ausgabe zu komponieren.

+0

Für ein normales Modell sind Sie korrekt, aber dies wird einen Pipe-Stream einer Datei zurückgeben, so dass ich JSON vermeiden muss. Die MVC-Aktion wird im src-Attribut eines Video-HTML-Elements verwendet. –

+0

Warum nicht einen Controller hinzufügen, der von ApiController und der Pipe die Ausgabe an Ihre Kunden ableitet? @RodneyPannell –

+0

Schwer zu erklären, warum ich WebAPI-Controller nicht zur öffentlichen Website hinzufügen kann, aber ApiController kann nicht auf der öffentlich zugänglichen Seite verwendet werden. Es ist keine "normale" MVC-Site. Wir verwenden normalerweise RestSharp, um Web API hinter der Dateiwand zu kontaktieren, aber dies ist ein komplett anderes Szenario als das Ziehen eines Modells aus einer Datenbank. –