【问题标题】:Inconsistent behavior when saving a PNG to Response.OutputStream将 PNG 保存到 Response.OutputStream 时行为不一致
【发布时间】:2011-04-24 15:11:01
【问题描述】:

这个问题与这个问题有关: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 不是。通过首先将位图写入 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);
    }
}

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

【问题讨论】:

  • 您在本地和生产环境中使用相同的网络服务器吗?我正在思考 VS 或 Cassini 中的嵌入式服务器与 IIS 之间的区别。
  • @BurningIce 这也是我想到的第一个想法。我只在本地测试了 Cassini 中的行为,而生产环境运行的是 IIS。
  • 嗯,应该很容易找到...在本地代码中放置一个调试点,并与调试器一起检查 context.Response.OutputStream 是否似乎是可搜索的。

标签: asp.net gdi+ png memorystream outputstream


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多