定期收到“ GDI +中发生一般错误”

时间:2018-07-01 21:43:04

标签: c# asp.net-mvc gdi+ memorystream

我将不胜感激。这是一个非常著名的问题,但是无论我阅读并尝试将其应用于我的具体案例,都无济于事。

我有一个简单的函数,它将图像作为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);
    }
}

但是没有帮助。

0 个答案:

没有答案