3

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

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

这是在本地工作的原始代码:

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

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

GDI+ 中出现一般错误。

经过一番挖掘,我确定问题出在保存 PNG 图像需要一个可搜索的流”这一事实。' - Response.OutputStream 不是。通过首先将位图写入 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);
    }
}

我很想知道为什么原始代码在本地运行良好,但在生产服务器上却失败了?代码失败背后的原因对我来说听起来很黑白,所以我不明白为什么会存在特定于环境的不一致。

4

1 回答 1

0

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

于 2010-10-13T02:16:40.713 回答