Почему асинхронные изображения, сгенерированные ASHX, не всегда работают в IE6?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 673
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я сам отвечу на него, но мне потребовалось 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.

Нет, я не создаю весь контент перед переходом в асинхронный режим. Заголовок создается только после обратного вызова.

Jader Dias 04.01.2009 20:15

просто к сведению, спецификация находится в ietf.org/rfc/rfc2616.txt, вас интересует раздел 4.4

Frank Schwieterman 04.01.2009 20:54

Другие вопросы по теме