0

希望这不是重复...

假设我有一个 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 看起来很奇怪......在它看似超时后,萤火虫实际上会显示整个加载的图像......所以在这种情况下,IIS 似乎已经发送了所有内容......

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

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

  • 编辑 -

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

我将把系统带到另一台机器上,稍后再进行测试...稍后再尝试更改为 .ashx...

4

1 回答 1

1

不确定那里运行的其他代码,但您需要确保在写入任何内容之前先清除您的响应:

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

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

编辑

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

于 2012-10-16T08:18:12.510 回答