Периодически появляется сообщение «Произошла общая ошибка в GDI +» - PullRequest
0 голосов
/ 02 июля 2018

Буду признателен за любую помощь. Это очень известная проблема, но что бы я ни читал и пытался применить к моему конкретному случаю, это не помогло.

У меня есть простая функция, которая берет изображение в виде строки base64 и сохраняет его как изображение в формате png. Папка назначения является постоянной. Имя файла берется из параметра imageUrl и становится уникальным перед сохранением.

public static void SaveWorkOrderImage(string imageData, string imageUrl)
{
    try
    {
        //convert png image saved in a base64 string to Image object
        imageData = imageData.Replace("data:image/png;base64,", "");
        byte[] bytes = Convert.FromBase64String(imageData);

        //...
        //some code here which generates the destination path for the new image
        //...

        using (MemoryStream ms = new MemoryStream(bytes))
        {
            using (System.Drawing.Image newData = System.Drawing.Image.FromStream(ms))
            {
                using (Bitmap bmpData = new Bitmap(newData))
                {
                    bmpData.Save(destPath, ImageFormat.Png);
                }
            }
        }

    }
    catch (Exception ex)
    {
        //processing and logging exception
    }
}

Этот код прекрасно работает как приложение MVC в IIS. Но внезапно, примерно через неделю безупречной работы, он начинает выдавать следующее исключение для каждого сохраненного изображения:

Тип исключения: System.Runtime.InteropServices.ExternalException Исключение: общая ошибка произошла в GDI +. Трассировки стека: в System.Drawing.Image.Save (имя файла строки, кодировщик ImageCodecInfo, кодировщик EncoderParameters кодировщикParams) в System.Drawing.Image.Save (строковое имя файла, формат ImageFormat)

Если я перезапущу пул приложений, он снова будет работать нормально в течение нескольких дней. Обычно около недели. Затем все повторяется снова. Похоже, что некоторые ресурсы не размещаются, или переполнение некоторого буфера. Но, как вы можете видеть, для каждого одноразового объекта есть выражение «с помощью». Я также попытался сначала преобразовать его в растровое изображение (я нашел такой совет в аналогичном вопросе). Это выглядело так раньше:

using (MemoryStream ms = new MemoryStream(bytes))
{
    using (System.Drawing.Image newData = System.Drawing.Image.FromStream(ms))
    {
        newData.Save(destPath, ImageFormat.Png);
    }
}

Однако это не помогло.

...