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
@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
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. –
@FIllip W - Das funktioniert gut für mich. Vielen Dank für Ihre Hilfe. Ich habe deine Antwort akzeptiert. Danke nochmal – raj