将PNG保存到Response.OutputStream时的行为不一致

时间:2010-10-13 01:49:14

标签: asp.net gdi+ png memorystream outputstream

这个问题与此有关:Cannot render image to HttpContext.Response.OutputStream。这不是重复。

尝试将PNG保存到Response.OutputStream时,我遇到本地开发环境和生产环境之间的不一致行为。也就是说,我最初使用的代码在本地工作正常,但在生产服务器上失败了。

以下是本地工作的原始代码:

using (Bitmap bmp = challenge.RenderImage()) { 
    bmp.Save(context.Response.OutputStream, ImageFormat.Png); 
}

尽管在本地工作,当我在生产服务器上部署它时,我收到了一个应用程序错误:

  

GDI +中发生了一般性错误。

经过一番挖掘后,我确定问题出现在'Saving a PNG image requires a seekable stream.'这一事实中 - Response.OutputStream不是。首先将Bitmap写入System.IO.MemoryStream,然后再写入Response.OutputStream,可以轻松缓解此问题。

using (Bitmap bmp = challenge.RenderImage()) {
    using(MemoryStream ms = new MemoryStream()) {
        bmp.Save(ms, ImageFormat.Png);
        ms.WriteTo(context.Response.OutputStream);
    }
}

我很想知道为什么原始代码在本地工作正常,但在生产服务器上失败了?代码失败的原因对我来说听起来很黑白,所以我不明白为什么环境特定的不一致可能存在。

1 个答案:

答案 0 :(得分:0)

从理论上讲,你可以实现自己的可搜索流,并将其作为过滤器添加到你的Response.Filter属性上,所以也许Cassini正在做类似的事情。这是一个连接您自己的流的示例:http://www.ericis.com/2007/6/21/Obtaining%20ResponseOutputStreamLength