将png保存到outputstream截断

时间:2012-10-16 08:11:11

标签: c# browser iis-7.5

希望这不重复...

假设我有一个png格式的图像,大小约为300kb,我从这样的aspx文件发送到客户端:

Bitmap img = new Bitmap(filepath);
using(MemoryStream ms = new MemoryStream())
{
    img.save(ms, ImageFormat.Png);

    Response.ContenType="image/png";
    ms.WriteTo(Response.OutputStream);
}
img.Dispose();

在客户端javascript中,它只是:

var img = new Image();
img.src = xxx.aspx?param=semething;

这通常有效......但偶尔反应似乎会缩短。 Chrome会等待请求,直到超时为止。在firebug中,在Net选项卡下的Images视图中,请求实际上显示如下内容:

Get xxx.aspx?param=something   hostUrl   0(14.7mb) 127.0.0.1:80

那个14.7mb看起来非常古怪...在它看似超时后,firebug实际上会显示整个加载的图像..所以在这种情况下IIS会发出一切......

在所有情况下,标题都正确显示contentType和content-Length。 在我关闭浏览器或从网页上提取图像之前,有时请求才会结束。然后我可以找到IIS向事件日志发送错误消息,说明远程主机已关闭连接。

我似乎无法确定问题所在......

  • 编辑 -

更改为简单地执行Response.TransmitFile(filePath),但问题仍然存在。 至少在chrome中我认为请求最终会在90秒后被浏览器终止。 IIS没有记录任何错误...... 看起来IIS认为它已经完成了所有必须做的事情......但是在浏览器的路上......在本地机器上丢失了一些东西。

我将系统带到另一台机器并稍后测试... 并且稍后尝试更改为.ashx ...

1 个答案:

答案 0 :(得分:1)

不确定其他代码是否正在运行,但您需要先确认清除响应,然后再将其写入其中:

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();

另外,我强烈建议您使用 Response.TransmitFile 而不是将文件读入内存,读取它然后写入输出流可能真的耗费内存。

修改

此外,如果您可以更改为使用.ashx而不是.aspx,它可能会更快。