我们正在使用System.Drawing和应用程序来处理Web应用程序中的图像(旋转,翻转等)。上个月我们偶尔会出现以下错误。
“尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”
基于MSDN Library,我们不应该在我们的Web应用程序中使用System.Drawing(参见下面的插入内容)。
不支持在Windows或ASP.NET服务中使用System.Drawing.Imaging命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。
这似乎不对,因为ASP.Net上有一个完整的论坛,用于在ASP.Net应用程序中使用System.Drawing。另外,我发现的所有Web Image Editor控件都使用Sytem.Drawing,这是我认为它不是System.Drawing真正问题的另一个原因。所以我的问题是:
1)在ASP.Net应用程序中使用System.Drawing时是否还有其他人有此问题?如果是这样,那么修复是什么。
2)抛出错误的行在下面,问题可能是我们正在使用MemoryStream而不是System.Drawing的问题?使用不同类型的流会解决问题。
using (System.Drawing.Image oFullImg = System.Drawing.Image.FromStream(msImage))
3)如果确实存在问题并且我们不应该使用System.Drawing,那么还有其他替代方法可以在网站上操作图像。
随着时间的推移,这已成为一个更为关键的问题,因此我能更快找到解决方案。任何帮助将不胜感激。
答案 0 :(得分:1)
好吧,您描述的警告是在System.Drawing.Imaging命名空间的MSDN文档中,它没有比官方更正式。
查看Scott Hanselman撰写的this文章,了解它是否可以解决问题并查看codeplex上的ASP.NET Generated Image项目。
最重要的是,在讨论您的问题时,请查看用户评论。
最重要的是,它似乎可行,但微软不支持。
答案 1 :(得分:1)
我们在几个ASP.NET应用程序中广泛使用System.Drawing命名空间,我们也收到此错误。它完全不一致,我开始相信它与环境(系统资源使用,并发请求数等)的关系与其他任何事情有关。我不能为您提供一个解决方案,以确保不会发生这种情况,除了转向面向SOA的解决方案,其中图像处理从ASP.NET站点的域中取出,但我会说你可以通过绝对肯定地最小化这些事件,毫无疑问地确定您正在处理实现IDisposable 的System.Drawing和System.Drawing.Imaging命名空间中的任何对象。看起来你已经使用了使用模式,但是有一些奇怪的对象(比如System.Drawing.Imaging.EncoderParameters)需要与通常的嫌疑人一起处理。
除此之外,您还可以执行其他操作,例如在自己的IIS应用程序池中设置站点并将池设置为定期回收,这可能有所帮助。
但是,我会看到这个问题,因为我很乐意看到这个问题的100%解决方案。答案 2 :(得分:0)
我猜测AccessViolationException是由损坏的图像触发的。损坏的图像可能会欺骗GDI尝试读取流的末尾。
我建议记录发生的图像,然后分析图像以查看它是否可重复。
您是在对图像执行量化,还是使用LockBits直接访问数据?