web-dev-qa-db-fra.com

Diffusion d'images volumineuses avec ASP.Net Webapi

Nous essayons de renvoyer des fichiers image volumineux en utilisant ASP.Net WebApi et en utilisant le code suivant pour transmettre les octets au client.

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

Le code ci-dessus fonctionne bien, mais certains des fichiers que nous traitons pourraient avoir une taille supérieure ou égale à 2 Go, ce qui entraînerait des délais de connexion. Nous avons déjà utilisé un code similaire à ci-dessous (à l'aide de HttpHandlers) pour découper la réponse dans le flux de réponses afin de maintenir la connexion en vie avec succès.

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

Comment pouvons-nous utiliser une technique similaire à l'aide du nouveau modèle de programmation WebAPI présenté précédemment?

Merci d'avance

15
raj

Oui, vous pouvez utiliser PushStreamContent. Et si vous le combinez avec une exécution asynchrone (en utilisant, par exemple, des lambda asynchrones), vous obtiendrez des résultats encore plus efficaces.

J'ai blogué à propos de cette approche au début du mois - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/ .

L'exemple utilisé est un fichier vidéo, le principe est le même: réduire le nombre d'octets de données au client.

26
Filip W

Diffusez directement à partir du fichier en utilisant StreamContent (trop nouveau?). Semblable à Le contrôleur API Web convertit MemoryStream en StreamContent

httpResponseMessage.Content = new StreamContent(file);
0
drzaus