Я отвечу сам, но мне потребовалось 3 дня, чтобы решить эту проблему, когда я впервые столкнулся с этой проблемой.
Когда изображение запрашивается через свойство «src» HTML-тега «img», в определенных условиях браузеру MS IE6 требуется Content-Length для завершения запроса и отображения результата.
Синхронные изображения, сгенерированные ASHX, автоматически включают HTTP-заголовок «Content-Length», а асинхронная версия - нет. Поэтому, когда вы записываете вывод, сначала запишите его в поток памяти, прочитайте общую длину, запишите его как заголовок 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 Синхронная и Асинхронная версии моего кода, и я заметил еще 2 различия между ними:
1) Асинхронный обработчик делит ответ на 3 TCP-пакета вместо одного.
2) Синхронная версия использует другой заголовок "Keep-Alive" (я не помню, какой именно)