Esiste un modo consigliato per restituire un'immagine utilizzando l'API Web ASP.NET


Risposte:


147

Non dovresti restituire a System.Drawing.Image, a meno che tu non aggiunga anche un formattatore che sa come convertirlo nei byte appropriati non si serializza come byte dell'immagine come ti aspetteresti.

Una possibile soluzione è restituire un HttpResponseMessagecon l'immagine memorizzata nel suo contenuto (come mostrato di seguito). Ricorda che se desideri l'URL mostrato nella domanda, avresti bisogno di un percorso che mappi i parametri {imageName}, {width} e {height}.

public HttpResponseMessage Get(string imageName, int width, int height)
{
    Image img = GetImage(imageName, width, height);
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(ms.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");

        return result;
    }
}

Ma di nuovo, se lo fai in molti posti, seguire il percorso del formattatore potrebbe essere il modo "consigliato". Come quasi tutto nella programmazione, la risposta dipenderà dal tuo scenario.


Anche l'immagine dovrebbe essere usata?
— dibs487

Dov'è il GetImagemetodo?
— Yoda

1
@Yoda è il metodo della tua implementazione che restituirà l'immagine che deve essere ritrasferita al client.
— carlosfigueira

Se stai restituendo un file dal disco rigido, penso che sarebbe una prestazione migliore usare un FileStream, come questo (vedi la risposta accettata in questa domanda): stackoverflow.com/questions/11125535/…
— John Gilmer

19

Le immagini sono pesanti. ASP.NET WebForms, HttpHandlers, MVC e Web API svolgono tutti un lavoro assolutamente terribile nel servire file statici. IIS fa un estremamente buon lavoro di che - Spesso 20-100X in modo più efficiente.

Se vuoi ottenere buone prestazioni, riscrivi l'URL al più tardi durante PostAuthorizeRequest, in modo che IIS possa prelevare e servire il file. Sì, questo significa che la gestione degli eventi a livello di HttpModule.

[Disclaimer: sono l'autore del seguente articolo e progetto open-source]

Se stai facendo qualcosa di dinamico con le immagini, dai un'occhiata a questo articolo sulle insidie ​​dell'elaborazione delle immagini da evitare e considera di dare un'occhiata a ImageResizer . Ha un'eccellente memorizzazione nella cache del disco (che utilizza la gestione dei file statici IIS) ed è facile da collegare alla generazione di immagini di qualsiasi tipo. Ha collegamenti opzionali anche per AForge, FreeImage e WIC, se hai bisogno di progredire.


2
Ho utilizzato ImageResizer nel mio progetto e sono molto soddisfatto di come funziona, oltre a me. L'unico inconveniente è che parte della documentazione deve essere aggiornata.
— Jon L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.