使用System.Drawing在ASP.NET应用程序中创建缩略图看起来非常容易。但 MSDN告诉你

  

不支持在Windows或ASP.NET服务中使用System.Drawing命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。

我在这种类型的GDI +代码中看到间歇性的“内存不足”错误。我开始怀疑这是原因。

人们如何进行服务器端图像处理?任何人都可以推荐任何不会炸毁我的服务器的替代方案吗?

以下相关代码。 System.Drawing.Graphics.DrawImage中间歇性地发生异常。我刚刚继承了这个项目,所以我需要检查一下日志,看看这个项目被频繁发生的频率/我们获得异常的频率......

public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
    Bitmap bitmap = new Bitmap(newWidth, newHeight);
    Graphics g = Graphics.FromImage(bitmap);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
    g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);

    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Jpeg);

    // clean up memory leaks
    if (bitmap != null)
    {
        bitmap.Dispose();
        bitmap = null;
    }
    if (g != null)
    {
        g.Dispose();
        g = null;
    }


    return stream.ToArray();
}

更新:我已经在整个项目中搜索了我们使用GDI +的任何地方,并将 using(){} 放在 IDisposable 的所有内容周围>。自从我这样做以来,我没有看到一个“内存不足”的异常。

有帮助吗?

解决方案

假设你要做“东西”根据请求,问题可能是

  1. 处理器密集型操作:处理图像,这可能需要一些时间。

  2. 如果您要保存文件,则会导致磁盘问题。

  3. 您可以考虑使用 HTTP处理程序

  4. 处理System.Drawing对象应该是一个优先事项(使用(){}声明)

  5. 可以在这里探索异步页面

其他提示

为什么不设置通过Web服务公开的单独工作服务器。

我建议你在这些操作中加入一些异常处理代码,这样你就可以保证丢弃你的GDI +对象。关闭你的溪流的好习惯......虽然据我所知 MemoryStream 对象是管理的,所以当GC'd关闭时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top