2016-08-31 3 views
10

Приложение ASP.NET на моем сервере начинает бросать исключение GDI + после запуска в течение нескольких дней. После перезапуска сервера все работает нормально в течение нескольких дней, а затем внезапно это исключение происходит снова. После первого раза это происходит каждый раз, когда я пытаюсь сохранить изображение PNG, пока я не перезапущу его снова.GDI + исключение при сохранении изображения в формате PNG

Когда я пытаюсь сохранить изображение в формате JPEG, он отлично работает.

Когда я запускаю этот код из моего проекта, он не:

var path = @"C:\Project\images\logo.png"; 
var image = Image.FromFile(path); 

using (var ms = new MemoryStream()) 
{ 
    image.Save(ms, ImageFormat.Png);  // Fails here on GDI+ exception. 
    //image.Save(ms, ImageFormat.Jpeg); // JPEG works somehow 
} 

снова: Когда я перезагружать удаленный рабочий стол и запустить этот код, он работает в течение нескольких дней, и в какой-то момент вдруг начинает терпеть неудачу вновь и вновь.

Я пробовал:

  1. Чтобы сделать консольное приложение с тем же кодом и запустить его в ДДП, где проект. Все прошло отлично!

  2. Множество различных вариантов кодов, которые были предложены более чем в 10 статьях, которые я читал на эту тему.

  3. GCI.Collect() - без помощи.

  4. Проверено все папки, у которых есть права на запись (возможно, что-то есть с IIS?).

  5. Подробнее.

Я думаю, что это должно быть какая-то конфигурация, которая внезапно меняется из-за чего-то, и я не могу понять, что это может быть.

+0

Попробуйте использовать 'Image img = Image.FromStream (новый MemoryStream (File.ReadAllBytes (путь)); '. См. Http://stackoverflow.com/questions/788335/why-does-image-fromfile-keep-a-file-handle-open-sometimes –

+0

Формат изображения - не настоящая причина. Скорее: вы пытаетесь перезаписать оригинал (png). См. [Здесь] (http://stackoverflow.com/questions/37736815/overwrite-image-picturebox-in-c-sharp/37741101?s=1|5.7472#37741101) – TaW

+1

Так что же это за исключением? – Evk

ответ

8

После перезапуска сервера все работает нормально в течение нескольких дней, а затем внезапно это исключение происходит, и после первого раза это произойдет каждый раз, когда я пытаюсь сохранить изображение PNG, пока не перезапущу его снова.

Звучит как утечка памяти для меня. С какой версией .NET это скомпилировано? На какой серверной ОС это работает?

Вы можете начать заключая изображение в блоке с помощью:

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     image.Save(ms, ImageFormat.Png); 
    } 
} 

This link Я считаю, что имеет отношение к вашему делу.

3

Он бросает ошибку GDI +, потому что один из ваших объекта не расположен, поэтому лучше удаляйте используемый объект.

Если вы получаете эту ошибку, я могу сказать, что ваше приложение не имеет права на запись в какой-либо каталог.

GDI + ограничивает высоту изображения в 65534

Всегда выступают за помощью что используя заявление. Который никогда не забывает распоряжаться объектом, даже если код генерирует исключение.

var path = @"C:\Project\images\logo.png"; 
using (Image image = Image.FromFile(path)) 
{ 
     using (var ms = new MemoryStream()) 
     { 
      image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
      //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
     } 
} 

метод FromFile блокирует файл, так что используйте Image.FromStream() метод для считывания изображения:

byte[] bytes = System.IO.File.ReadAllBytes(filename); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 
using (var ms = new MemoryStream()) 
{ 
     image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception. 
     //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow 
} 
0

В принципе, если у вас есть одноразовые предметы ... Утилизировать их! Изображение одноразовое, и в качестве растрового изображения оно использует ресурсы Windows. Если вы не распоряжаетесь, ресурсы Windows не освобождаются, пока вы не отключите приложение. Таким образом, вам нужно избавиться от любого экземпляра.

Смежные вопросы