ASP.NET создает эскизы на стороне сервера - PullRequest
4 голосов
/ 11 сентября 2009

С виду System.Drawing выглядит довольно простым для создания миниатюр в вашем приложении ASP.NET. Но MSDN говорит вам :

Классы в пространстве имен System.Drawing не поддерживаются для использования в службе Windows или ASP.NET. Попытка использовать эти классы из одного из этих типов приложений может привести к непредвиденным проблемам, таким как снижение производительности службы и исключения во время выполнения.

Я вижу прерывистые ошибки «нехватки памяти» в этом типе кода GDI +. Я начинаю подозревать, что это причина.

Как люди выполняют манипуляции с изображениями на стороне сервера? Кто-нибудь может порекомендовать какую-либо альтернативу, чтобы не взорвать мой сервер?

Соответствующий код ниже. Исключение периодически происходит в System.Drawing.Graphics.DrawImage. Я только что унаследовал этот проект, поэтому мне нужно проверить журналы, чтобы увидеть, как часто это происходит / как часто мы получаем исключение ...

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

ОБНОВЛЕНИЕ : Я искал во всем проекте, где бы мы ни использовали GDI +, и поместил using() { } вокруг всего, что IDisposable. С тех пор как я это сделал, я не видел ни одного исключения «недостаточно памяти».

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

Предполагается, что вы будете делать "вещи" для каждого запроса, проблемы могут быть

  1. Интенсивная работа процессора: манипуляции с изображениями, которые могут занять время.

  2. В случае сохранения файла это приведет к проблемам с диском.

  3. Вы можете рассмотреть возможность использования обработчиков HTTP ,

  4. Удаление System.Drawing объектов должно быть приоритетом ( с использованием оператора () {})

  5. Асинхронные страницы можно изучить здесь.

0 голосов
/ 11 сентября 2009

Я бы порекомендовал вам поместить код обработки исключений вокруг этих операций, чтобы вы гарантированно избавились от своих объектов GDI +. Хорошей практикой также является закрытие ваших потоков ... хотя, насколько мне известно, MemoryStream объект управляется, он должен закрываться, когда GC'd.

0 голосов
/ 11 сентября 2009

Почему бы вам не настроить отдельный рабочий сервер, который предоставляется через веб-сервис.

...