ASP.NET Erstellen von Thumbnails Server-Seite
Frage
Es sieht desceptively leicht System.Drawing verwenden Thumbnails in Ihrer ASP.NET-Anwendung zu erstellen. Aber MSDN sagt Ihnen :
'Out of memory' Fehler innerhalb dieser Art von GDI + CodeKlassen im System.Drawing-Namespace sind nicht für die Verwendung in einem Windows oder ASP.NET-Dienst unterstützt. Der Versuch, diese Klassen zu verwenden aus einer dieser Anwendungstypen erzeugen können unerwartete Probleme wie verminderte Betriebsleistung und Laufzeitausnahmen.
Ich sehe intermittented. Ich fange an, dies zu vermuten, dass die Ursache ist.
Wie geht es Menschen serverseitige Bildbearbeitung? Kann jemand eine Alternative empfehlen, dass mein Server nicht sprengen?
Der entsprechende Code unten. Die Ausnahme geschieht intermittierend in System.Drawing.Graphics.DrawImage. Ich habe gerade dieses Projekt geerbt, also würde ich brauchen, um die Protokolle zu überprüfen, um zu sehen, wie oft diese getroffen wird / wie oft bekommen wir eine Ausnahme ...
public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
Bitmap bitmap = new Bitmap(newWidth, newHeight);
Graphics g = Graphics.FromImage(bitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);
MemoryStream stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Jpeg);
// clean up memory leaks
if (bitmap != null)
{
bitmap.Dispose();
bitmap = null;
}
if (g != null)
{
g.Dispose();
g = null;
}
return stream.ToArray();
}
UPDATE : Ich durch das gesamte Projekt gesucht haben überall da wir GDI verwenden + und setzen using() { }
um alles, was IDisposable
ist. Ich habe ‚out of memory‘ Ausnahme nicht gesehen, da ich das getan habe.
Lösung
Angenommen, Sie „Material“ pro Anfrage tun werden, könnten die Probleme sein
-
Der Prozessor intensiver Vorgang. Manipulation von Bildern, die Zeit in Anspruch nehmen könnte
-
Wenn Sie die Datei speichern, wird es auf die Festplatte Problemen führen.
-
Sie können mit HTTP-Handler ,
-
System.Drawing Objekte Entsorgung sollte eine Priorität ( mit () {} statement)
-
Asynchronous Seiten können hier erkundet werden.
Andere Tipps
Warum Sie setzen keine separaten Arbeits Server auf, die über einen Web-Service ausgesetzt ist.
Ich würde Sie empfehlen, um diese Operationen eine Ausnahmebehandlung Code zu setzen, so dass Sie garantiert sind, Ihre GDI + Objekte zu entsorgen. Gute Praxis Ihre Streams zu schließen ... obwohl meines Wissens MemoryStream
Objekt verwaltet wird, so sollte sich schließen, wenn GC'd.