Если вы используете WebHandler, наследующий IHttpAsyncHandler, вы не должны замечать, что при неопределенных конкретных обстоятельствах браузер MS IE6 не отобразит его, запрос никогда не завершится. Есть ли исправление?





Я сам отвечу на него, но мне потребовалось 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);
}
}
Я сделал tcpdump как синхронную, так и асинхронную версии своего кода, и я заметил еще 2 различия между ними:
1) Асинхронный обработчик делит ответ на 3 TCP-пакета вместо одного.
2) В синхронной версии используется другой заголовок Keep-Alive (не помню, какой).
Спецификация HTTP описывает, как клиент должен определять длину запроса (в частности, когда длина содержимого не используется). IIRC, если заголовок длины содержимого отсутствует и ответ не разбит на фрагменты, то конец запроса обнаруживается, когда соединение закрывается (что может указывать на то, почему поведение сохранения активности было изменено - вы не можете использовать keep -alive, если время жизни соединения используется для указания длины запроса). Я ожидаю, что ASP.NET позаботится об этом автоматически. Возможно, вам не хватает какого-то вызова, который сообщает ASP.NET о завершении ответа.
Кажется, что создание всего содержимого, чтобы вы могли добавить заголовок длины содержимого перед переходом в асинхронный режим, в первую очередь лишает смысла использование асинхронного HttpHandler.
просто к сведению, спецификация находится в ietf.org/rfc/rfc2616.txt, вас интересует раздел 4.4
Нет, я не создаю весь контент перед переходом в асинхронный режим. Заголовок создается только после обратного вызова.