download - maphttproute - Transmisión de imágenes de gran tamaño con ASP.Net Webapi
web api rest c# (2)
Estamos tratando de devolver archivos de imagen grandes utilizando ASP.Net WebApi y utilizando el siguiente código para transmitir los bytes al cliente.
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;
}
}
El código anterior funciona bien, pero algunos de los archivos que manejamos podrían tener un tamaño de 2 GB o superior, lo que da como resultado tiempos de espera de conexión. Hemos utilizado un código similar al de abajo en el pasado (usando HttpHandlers) para dividir la respuesta al flujo de respuesta para mantener la conexión activa con éxito.
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();
}
¿Cómo podemos utilizar una técnica similar utilizando el nuevo modelo de programación WebAPI que se mostró anteriormente?
Gracias de antemano
Sí, puedes usar PushStreamContent
. Y si lo combina con una ejecución asincrónica (usin es decir, async lambdas), puede obtener resultados aún más efectivos.
He escrito sobre este enfoque a principios de este mes: http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/ .
El ejemplo usó un archivo de video, el principio es el mismo: enviar bytes de datos al cliente.
Transmita directamente desde el archivo usando StreamContent
(¿demasiado nuevo?). Similar a Web API Controller convierte MemoryStream en StreamContent
httpResponseMessage.Content = new StreamContent(file);