Asp.net GDI+;中出现间歇性一般错误;保存图像时

Asp.net GDI+;中出现间歇性一般错误;保存图像时,asp.net,vb.net,Asp.net,Vb.net,我在ASP.NET 4.0中构建了一个动态图像大小调整web应用程序,它使用IIS 7.5在Windows 2008 R2服务器上运行 图像本身以二进制max字段的形式存储在SQL 2008 R2数据库中(图像足够小,因此这是可行的,我们最初尝试了filestream选项,但速度太慢) 我查询数据库以检索字节数组形式的“blob”,并将其加载到图像对象中,如下所示: Dim imageOriginal as Image = Nothing Dim imageResized as Image =

我在ASP.NET 4.0中构建了一个动态图像大小调整web应用程序,它使用IIS 7.5在Windows 2008 R2服务器上运行

图像本身以二进制max字段的形式存储在SQL 2008 R2数据库中(图像足够小,因此这是可行的,我们最初尝试了filestream选项,但速度太慢)

我查询数据库以检索字节数组形式的“blob”,并将其加载到图像对象中,如下所示:

Dim imageOriginal as Image = Nothing
Dim imageResized as Image = Nothing

imageOriginal = FindOriginalImage()
我需要对它做一些事情-如果它是PNG,我必须在白色画布上绘制它,或者如果我需要调整图像大小,我会得到一些非常疯狂的条纹。我还可能缩小它的规模,可能在它上面加上水印,并在将其提供给最终用户之前将其保存到磁盘。为了完成所有这些,我发现我必须创建第二个图像对象,以便在将其保存到磁盘之前执行一些必要的任务,因此我将原始图像复制到调整大小的对象中进行处理。见下文:

If Not imageOriginal is nothing then
    imageResized = imageOriginal
(如果在数据库中找不到图像,则调用FindOriginalImage将返回值NOTHING)

。。。。所有其余的大小调整,水印等-这段代码的所有作品

在对imageResized对象执行所有需要执行的操作后,我运行以下行:

imageResized.Save(DestinationFile, ImageFormat.Jpeg)
大多数情况下,这种方法都能顺利工作,但当我试图将文件保存到磁盘时,偶尔会出现GDI+通用错误

当然,我在处理完这两个对象后也会处理这两个对象:

imageResized.Dispose()
imageOriginal.Dispose()
GC.Collect()

有什么想法吗?

一般来说,“GDI+一般错误”通常是由于文件系统权限问题引起的。检查以确保运行应用程序池的上下文对要保存的文件夹具有适当的“写入”权限

首先尝试将映像保存到MemoryStream,然后将内存流转储到文件系统-至少您可以排除文件/访问问题。

为应用程序池使用的标识正确设置了权限,我们已经对此进行了验证。它通常是有效的,但偶尔我们会遇到这样一个奇怪的小故障——这可能是由文件系统过载引起的吗?很多人都在发出请求——每天超过200000个,而我通常只看到不到100个。如果要覆盖源文件,必须确保首先处理打开/锁定该文件的对象。使用块的
将有助于HMMM的兴趣-实际上,有可能有多少请求是由多个人触发的,从而“调整”图像大小的代码(这是一个自定义的404处理页面)。一旦按照要求的大小创建了映像,所有未来的用户都将直接使用它-因此,除非删除已调整大小的版本,否则代码不应再次运行。我将对此进行调查——鉴于这种罕见的情况,这可能就是原因。我喜欢这个答案。我会尝试一下,如果我仍然看到它,我会告诉你。仍然看到错误,但至少我现在确切地知道它发生在哪里。在过去两个小时内发生了3次,发生在我试图在磁盘上创建.JPG目标文件时,然后才写出内存流。