Большинство вопросов об этой ошибке (и ничего себе, их много) вращаются вокруг сохранения в файл, что не то, что я делаю.Общая ошибка, произошедшая в 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);
Вы посмотрели вопрос [this] (http://stackoverflow.com/questions/1772083/when-drawing-an-image-system-runtime-interopservices-externalexception-a-gener)? –
@FredrikLundvall Да, я видел это, но если я правильно его читаю, это не должно быть последовательным, верно? Случилось бы только в зависимости от настроения сборщика мусора в то время? Сейчас 100% времени на моем рабочем сервере, я получаю ошибку и 0% времени в других моих двух. –
Я думаю, вы правы, это не должно терпеть неудачу все время. –