【发布时间】:2016-06-17 12:37:51
【问题描述】:
关于这个错误的大多数问题(哇,有很多)都围绕着保存到文件,这不是我正在做的。
我的代码如下——.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+ 中出现一般错误。
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
在 iTextSharp.text.Image.GetInstance(Image image, ImageFormat 格式)
因此,尝试将图像保存到 MemoryStream 时失败,而不是文件或 HTTP 响应。
这刚刚开始发生在以前运行良好的现有应用程序上。完全相同的代码在不同的服务器和我的本地机器上完美运行(所有 3 个都是 2008R2),它发生在我的生产服务器上的每个应用程序(我有 4 个)上,甚至还有一个具有相同代码库的全新应用程序我放在那里测试这个问题。
所以我假设我的特定生产服务器有问题,也许是 IIS。两台服务器之间的 Windows 更新似乎相同,所以我认为不是这样。
您能想到的任何其他可能是特定环境导致此错误的原因?我可以重新编写代码来清理我们的部分,比如创建一个新的内存映像,而不是使用从文件创建的映像,但由于这是我的生产系统,我宁愿找一个短期的没有代码修复的解决方案。
编辑
一些有趣的东西,因为我正在排除故障...我向服务器添加了一个控制台应用程序,并使用与 Web 应用程序相同的帐户运行它,使用相同的代码(仅这几行),它运行良好.我使用新的应用程序池添加了一个具有相同几行的空 MVC 应用程序,它运行良好 - 我将此应用程序池更改为使用与主应用程序相同的用户帐户,它仍然可以运行。
我将新的测试应用程序更改为与该应用程序相同的应用程序池,但它失败并出现与常规应用程序相同的异常。所以那个应用程序池有问题,但不是用户。
据我所知,应用程序池是相同的。而且主要的是一夜之间回收的,昨天看到问题了,所以一个recycle也没解决。
如果我无法解决问题,我将在今晚重置 IIS 和/或服务器,看看是否能解决问题。
编辑 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] (stackoverflow.com/questions/1772083/…) 问题吗?
-
@FredrikLundvall 是的,我看过这个,但如果我没看错的话,应该不会这么一致吧?只会根据垃圾收集器当时的心情而发生吗?现在,在我的生产服务器中 100% 的时间出现错误,而在我的其他两个服务器中的时间为 0%。
-
我猜你是对的,它不应该一直失败。
-
可能是镜像文件的权限出了问题?
-
@FredrikLundvall 谢谢,但我在网络服务器上有 5 个单独的副本,包括我刚刚复制的全新副本,它们的行为都相同。但我还是尝试了 - 我删除了图像文件并重新复制它们并得到了同样的结果。
标签: c# asp.net-mvc-3 itextsharp gdi+