System.Drawing错误:它能否在ASP.Net应用程序中使用?

3
我们正在使用System.Drawing在一个Web应用程序中处理图像(旋转、翻转等)。在过去的一个月中,我们偶尔会遇到以下错误:
“尝试读取或写入受保护的内存。这通常是其他内存已损坏的迹象。”
根据MSDN Library的说明,似乎我们不应该在Web应用程序中使用System.Drawing(请参见下面的插入部分)。
System.Drawing.Imaging命名空间中的类不支持在Windows或ASP.NET服务中使用。尝试从其中一个应用程序类型中使用这些类可能会产生意外问题,例如降低服务性能和运行时异常。
这似乎不太对,因为在ASP.Net上有一个专门的论坛,可以在ASP.Net应用程序中使用System.Drawing。此外,我找到的所有Web图像编辑器控件都使用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,那么在网站上操作图像的其他替代方案是什么。

随着时间的推移,这个问题变得越来越紧迫,所以我能找到解决方案越快越好。任何帮助都将不胜感激。


我记得我曾经用过它,而且它也起作用了。但是我并不太记得代码的细节了。 - Adrian Godong
3个回答

1

嗯,你所描述的警告在System.Drawing.Imaging命名空间的MSDN文档中,这再正式不过了。

看看Scott Hanselman的this文章是否能解决问题,并查看codeplex上的ASP.NET生成图像项目。

最重要的是,查看用户评论,因为他们讨论了你的问题。

总之,它似乎可以工作,但Microsoft不支持。


已经在Codeplex上检查了ASP.Net生成的图像项目。具有讽刺意味的是,它在后台也使用System.Drawing库。因此,使用此库可能会出现与System.Drawing相关的其他问题。 - smehaffie
我几个月前确实玩过它。但是我使用System.Drawing.Imaging在我们的网站上生成图表,从未遇到任何问题。我猜测这不受支持可能有原因,也许他们无法找出问题所在,这就是他们的解决方案。 - jvanderh
我非常确定它不被支持,因为大多数开发人员不知道如何处理非托管内存,而且.NET对System.Drawing的垃圾回收处理得远远不够正确。如果你编写得当,你可以安全地使用它,在高负载条件下也可以使用。 - Lilith River

1
我们在几个 ASP.NET 应用程序中广泛使用 System.Drawing 命名空间,也遇到了这个错误。这完全是不一致的,我开始相信它与情况(系统资源使用,同时请求的数量等)有很大关系。我无法提供一个可以保证不会发生这种情况的解决方案,除非转移到基于 SOA 的解决方案,其中图像操作被从 ASP.NET 网站的域中取出,但我会说您可以通过确保绝对确定地处理实现 IDisposable 的 System.Drawing 和 System.Drawing.Imaging 命名空间中的任何对象来最小化这些情况。看起来您已经使用 using 模式做到了这一点,但还有一些奇怪的对象(比如 System.Drawing.Imaging.EncoderParameters)需要与常规对象一起处理。
除此之外,您还可以进行其他操作,例如将站点设置为自己的 IIS 应用程序池并定期将池回收,这可能有所帮助。
尽管如此,我仍会关注这个问题,因为我希望看到这个问题的 100% 解决方案。

0
我的猜测是AccessViolationException是由于图像损坏而触发的。 损坏的图像可能会欺骗GDI尝试读取流的末尾之后的内容。
我建议记录此问题发生时的图像,然后分析这些图像以查看是否可重复。
您是否对图像执行量化,或者使用LockBits并直接访问数据?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接