2013-02-04 8 views
14

Wir versuchen, große Bilddateien mit ASP.Net WebApi zurückgeben und den folgenden Code verwenden, um die Bytes an den Client zu streamen.Streaming großer Bilder mit ASP.Net Webapi

public class RetrieveAssetController : ApiController 
{ 

    // GET api/retrieveasset/5 
    public HttpResponseMessage GetAsset(int id) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(); 
     string filePath = "SomeImageFile.jpg"; 

     MemoryStream memoryStream = new MemoryStream(); 

     FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read); 

     byte[] bytes = new byte[file.Length]; 

     file.Read(bytes, 0, (int)file.Length); 

     memoryStream.Write(bytes, 0, (int)file.Length); 

     file.Close(); 

     httpResponseMessage.Content = new ByteArrayContent(memoryStream.ToArray()); 

     httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 

     httpResponseMessage.StatusCode = HttpStatusCode.OK; 

     return httpResponseMessage; 
    } 
} 

Der obige Code funktioniert gut, aber einige der Dateien, die wir bearbeiten können 2 GB und nach oben in der Größe sein, was zu Verbindungs-Timeouts. Wir haben in der Vergangenheit einen ähnlichen Code (unter Verwendung von HttpHandlers) verwendet, um die Antwort auf den Antwortstream zu teilen, um die Verbindung bei Erfolg aufrechtzuerhalten.

byte[] b = new byte[this.BufferChunkSize]; 
int byteCountRead = 0; 

while ((byteCountRead = stream.Read(b, 0, b.Length)) > 0) 
{ 
    if (!response.IsClientConnected) break; 

    response.OutputStream.Write(b, 0, byteCountRead); 
    response.Flush(); 
} 

Wie können wir eine ähnliche Technik mit dem neuen WebAPI-Programmiermodell verwenden, das zuvor gezeigt wurde?

Vielen Dank im Voraus

Antwort

26

Ja Sie PushStreamContent verwenden können. Und wenn Sie es mit einer asynchronen Ausführung kombinieren (using async lambdas), erhalten Sie möglicherweise noch effektivere Ergebnisse.

Ich habe Anfang dieses Monats über diesen Ansatz gebloggt - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/.

Das Beispiel verwendet eine Videodatei, das Prinzip ist das gleiche - schieben Datenbytes auf den Client.

+0

@FIllip W - Zunächst einmal vielen Dank für Ihre Hilfe. Ich habe nicht den Luxus, 4.5 Framework zu verwenden, daher kann ich die integrierten Async-Funktionen von 4.5 Framework nicht verwenden. Kann dieser Ansatz mit 4.0 Framework-Bibliotheken arbeiten? Genauer gesagt, wie würde sich die Aktion "WriteToStream" ändern? Kann ich nur jeden Byteblock lesen und in den Ausgabestream schreiben, ohne mich um Async-Teile zu sorgen? – raj

+0

Ja, alles in der Web-API ist 4.0-kompatibel. Sie können nur async/await entfernen und das Ganze synchron machen, oder einfach Fortsetzungen (ContinueWith) verwenden, wo immer der Code erwartet wird. –

+0

@FIllip W - Das funktioniert gut für mich. Vielen Dank für Ihre Hilfe. Ich habe deine Antwort akzeptiert. Danke nochmal – raj