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.