为什么异步ASHX生成的图像并不总是在IE6中工作?

时间:2008-12-23 17:23:09

标签: asp.net image asynchronous internet-explorer-6 ashx

如果您使用继承IHttpAsyncHandler的WebHandler,您不应该注意到在未确定的特定情况下浏览器MS IE6将不会显示它,请求将永远不会完成。它有解决方法吗?

2 个答案:

答案 0 :(得分:4)

我会自己回答,但是当我第一次遇到这个问题时,我花了3天时间来解决它。

当通过“img”HTML标签的“src”属性请求图像时,在某些情况下,浏览器MS IE6需要Content-Length来完成请求并显示结果。

同步ASHX生成的图像,自动包含“Content-Length”HTTP标头,但异步版本不包含。因此,在编写输出时,首先将其写入内存流,读取总长度,将其写为HTTP标头,然后将内存流写入输出。

像这样:

using (Image resizedImage = generateImage())
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        resizedImage.Save(memoryStream, ImageFormat.Jpeg);
        context.Response.AddHeader("Content-Length", memoryStream.Length.ToString());
        memoryStream.WriteTo(context.Response.OutputStream);
    }
}

我已经tcpdumped我的代码的同步和异步版本,我注意到它们之间还有两个不同之处:

1)异步处理程序将答案分为3个TCP数据包,而不是单个数据包。

2)同步版本使用不同的“Keep-Alive”标题(我记不起哪一个)

答案 1 :(得分:1)

HTTP规范概述了客户端应如何确定请求的长度(特别是在未使用内容长度时)。 IIRC如果内容长度标头不存在,并且响应没有分块,那么在连接关闭时检测到请求的结束(这可能表明为什么保持活动的行为已经改变 - 你不能使用keep -alive如果连接生命周期用于指示请求长度)。我希望ASP.NET能够自动处理这个问题。也许有一些你遗漏的电话告诉ASP.NET响应已经完成。

似乎生成整个内容以便在异步之前添加内容长度标头会破坏首先使用异步HttpHandler的目的。