2016-06-16 12 views
1

Большинство вопросов об этой ошибке (и ничего себе, их много) вращаются вокруг сохранения в файл, что не то, что я делаю.Общая ошибка, произошедшая в GDI + с iTextSharp, только на определенном сервере

Мой код выглядит следующим образом - .NET 4.5, MVC3, IIS7.5, Win2008R2:

string fileName = /* something.png */; 
string imageLocation = HttpContext.Current.Server.MapPath(
    string.Format(@"~/Content/images/{0}", fileName)); 

var image = iTextSharp.text.Image.GetInstance(
    System.Drawing.Image.FromFile(imageLocation), 
    System.Drawing.Imaging.ImageFormat.Png); 

Декомпиляция iTextSharp, метод GetInstance выглядит как:

public static Image GetInstance(Image image, ImageFormat format) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 

    image.Save(memoryStream, format); // <-- Exception here 

    return Image.GetInstance(memoryStream.ToArray()); 
} 

Исключение я получаю :

System.Runtime.InteropServices.ExternalException (0x80004005):

Общая ошибка произошла в GDI +.

в System.Drawing.Image.Save (поток поток, ImageCodecInfo кодировщик, EncoderParameters encoderParams)

в iTextSharp.text.Image.GetInstance (Изображение, формат ImageFormat)

Так что это провал при попытке сохранить изображение в MemoryStream, а не в файл или HTTP-ответ.

Это только что началось с существующим приложением, которое отлично срабатывало ранее. Точный же код отлично работает на другом сервере и на моем локальном компьютере (все 3 - 2008R2), и это случается с каждым приложением на моем производственном сервере (у меня есть 4), а также совершенно новым с той же кодовой базой, которую я ставил там для проверки этой проблемы.

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

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

EDIT

Некоторые интересные вещи, как я устранения неисправностей ... Я добавил консольное приложение на сервер, и запустил его, используя ту же учетную запись, как веб-приложение, с тем же кодом (только те, пара линий), и он работал нормально. Я добавил пустое приложение MVC с теми же парами строк, используя новый пул приложений, и он работал нормально - я изменил этот пул приложений, чтобы использовать ту же учетную запись пользователя, что и основное приложение, и она все еще работает.

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

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

Если я ничего не могу понять, я сброшу IIS и/или сервер сегодня вечером и посмотрю, очистит ли он это.

EDIT 2

Я просто пробовал различные комбинации этого (от this вопроса) на мой манекен приложения, а также положить еще один промежуточный образ там, и все еще ничего ...

var image = System.Drawing.Image.FromStream(
    new MemoryStream(System.IO.File.ReadAllBytes(imageLocation))); 

var image3 = iTextSharp.text.Image.GetInstance(
    image, System.Drawing.Imaging.ImageFormat.Png); 
+0

Вы посмотрели вопрос [this] (http://stackoverflow.com/questions/1772083/when-drawing-an-image-system-runtime-interopservices-externalexception-a-gener)? –

+0

@FredrikLundvall Да, я видел это, но если я правильно его читаю, это не должно быть последовательным, верно? Случилось бы только в зависимости от настроения сборщика мусора в то время? Сейчас 100% времени на моем рабочем сервере, я получаю ошибку и 0% времени в других моих двух. –

+0

Я думаю, вы правы, это не должно терпеть неудачу все время. –

ответ

1

Привод меня гайки ...

Это решение было разрешено с помощью «решения Microsoft» для его отключения и повторного включения - сброс IIS с помощью iisreset /restart в командной строке, и он снова работал.

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

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

  • Нет связанных вопросов^_^