3

我们正在使用 System.Drawing 和应用程序来操作 Web 应用程序中的图像(旋转、翻转等)。在上个月,我们偶尔会收到以下错误。

“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

根据 MSDN 库,我们似乎不应该在我们的 Web 应用程序中使用 System.Drawing(请参阅下面的插入)。

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

这似乎不正确,因为在 ASP.Net 上有一个完整的论坛用于在 ASP.Net 应用程序中使用 System.Drawing。另外,我发现的所有网络图像编辑器控件都使用 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,那么还有哪些其他替代方法可用于处理网站上的图像。

随着时间的推移,这正成为一个更关键的问题,所以我越快找到解决方案就越好。任何帮助将不胜感激。

4

3 回答 3

1

好吧,您描述的警告在 System.Drawing.Imaging 命名空间的 MSDN 文档中,没有比这更正式的了。

看看Scott Hanselman 的这篇文章,看看它是否能有所启发,看看 codeplex 上的 ASP.NET Generated Image 项目。

最重要的是在他们讨论您的问题时查看用户评论。

底线是它似乎可以工作,但不受 Microsoft 支持。

于 2009-07-10T15:26:18.837 回答
1

我们在几个 ASP.NET 应用程序中广泛使用 System.Drawing 命名空间,我们也收到此错误。这是完全不一致的,我开始相信它与环境(系统资源使用情况、并发请求数等)的关系比其他任何事情都重要。我无法为您提供保证不会发生这种情况的解决方案,除了转向面向 SOA 的解决方案,其中图像操作从 ASP.NET 站点的域中取出,但我会说您可以通过绝对肯定地毫无疑问地确保您正在处理实现 IDisposable 的 System.Drawing 和 System.Drawing.Imaging 命名空间中的任何对象,从而最大限度地减少这些事件的发生. 看起来您已经使用 using 模式执行此操作,但是有一些奇怪的对象(如 System.Drawing.Imaging.EncoderParameters)需要与通常的嫌疑人一起处理。

除此之外,您还可以做其他事情,例如在自己的 IIS 应用程序池中设置站点并将池设置为定期回收,这可能会有所帮助。

不过,我会关注这个问题,因为我很想看到这个问题的 100% 解决方案。

于 2009-07-10T16:10:28.373 回答
0

我的猜测是 AccessViolationException 是由损坏的图像触发的。损坏的图像可能会诱使 GDI 尝试读取流的末尾。

我建议记录发生这种情况的图像,然后分析图像以查看它是否可重复。

您是对图像执行量化,还是使用 LockBits 并直接访问数据?

于 2011-10-24T12:47:56.973 回答