我将不胜感激。这是一个非常著名的问题,但是无论我阅读并尝试将其应用于我的具体案例,都无济于事。
我有一个简单的函数,它将图像作为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
}
}
此代码与IIS中的MVC应用程序一样运行良好。但是突然间,在大约一个星期的完美工作中,它开始为保存的每个图像引发以下异常:
异常类型:System.Runtime.InteropServices.ExternalException 例外:GDI +中发生一般错误。 堆栈跟踪: 在System.Drawing.Image.Save处(字符串文件名,ImageCodecInfo编码器,EncoderParameters encoderParams) 在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);
}
}
但是没有帮助。