2012-09-17 4 views
60

zurückgeben Ich bin mit ASP.NET Web API herumspielen und ich bin neugierig auf die beste Möglichkeit, ein Bild mit 2 Parametern (x und y für die Größenänderung).Gibt es eine empfohlene Möglichkeit, ein Bild mit ASP.NET Web API

Zum Beispiel

~/api/image12345/200/200 

Wir kommen wieder ein 200 x 200 jpg/jpeg/oder gif

Sollte ich wieder ein System.Drawing.Image Objekt oder manuell den HTTPReponseMessage.Content definieren? Welcher Weg ist am effizientesten und niedrig am Overhead?

+0

Überprüfen Sie meine Antwort heraus hier: http://stackoverflow.com/a/20888749/64334 –

Antwort

104

Sie sollten System.Drawing.Image nicht zurückgeben, es sei denn, Sie fügen auch einen Formatierer hinzu, der weiß, wie er das in die entsprechenden Bytes konvertiert, serialisiert sich nicht wie die Bildbytes wie erwartet.

Eine mögliche Lösung ist die Rückgabe eines HttpResponseMessage mit dem Bild in seinem Inhalt gespeichert (wie unten gezeigt). Denken Sie daran, dass Sie eine Route benötigen, die die Parameter {imageName}, {width} und {height} abbildet, wenn Sie die in der Frage angezeigte URL verwenden möchten.

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

Aber noch einmal, wenn Sie an vielen Orten tun dies sind, geht die Formatierungs Route kann die „empfohlenen“ Weg. Wie bei fast allem Programmieren hängt die Antwort von Ihrem Szenario ab.

+0

Sollte das Bild sein, in ein zu verwenden? – dibs487

13

Bilder sind schwer. ASP.NET WebForms, HttpHandlers, MVC und Web API alle tun einen absolut schrecklichen Job der Bereitstellung von statischen Dateien. IIS tut eine extrem gute Arbeit davon - Oft 20-100x effizienter.

Wenn Sie eine gute Leistung erzielen möchten, führen Sie URL-Rewriting spätestens während PostAuthorizeRequest durch, damit IIS die Datei abholen und bereitstellen kann. Ja, das bedeutet Ereignisbehandlung auf HttpModule-Ebene.

[Disclaimer: Ich bin der Autor des folgenden Beitrages und Open-Source-Projekt]

Wenn Sie etwas dynamischer mit Bildern zu tun sind, überprüfen out this article on image processing pitfalls to avoid und betrachten einen Blick auf ImageResizer nehmen. Es verfügt über eine hervorragende Festplatten-Cachespeicherung (die die statische Dateiverwaltung von IIS verwendet) und lässt sich problemlos mit jeder beliebigen Bildgenerierung verbinden. Es hat optionale Bindungen für AForge, FreeImage und WIC, auch wenn Sie fortgeschritten sein müssen.

+0

Ich habe ImageResizer in meinem Projekt verwendet und bin sehr glücklich darüber, wie es funktioniert - und von mir. Nur meckern ist einige der Dokumentation muss aktualisiert werden. –

Verwandte Themen