ManagedPipelineHandler для AJAX POST аварийно завершает работу, если пользователь IE9 уходит со страницы во время выполнения этого вызова
Сценарий:
Пользователь использует IE9 (IE8 / 10 не затронут).У пользователя есть активный сеанс.Страница запускает запрос AJAX POST (не влияет) на контроллер сSessionState(SessionStateBehavior.Required)
атрибут (ReadOnly
не затронут). Что-то удерживает этот запрос от немедленной обработки (например, выполняется другой запрос с заблокированным сеансом).Пока выполняется AJAX POST, пользователь уходит со страницы (GET или POST - нене имеет значения)Результат:
AJAX POST завершает работу и возвращает HTTP 500 (который браузер с тех пор прекратил прослушивать, но вы можете увидеть его в журналах IIS). IIS Failed Request Tracing показывает ошибку "Указанное сетевое имя больше не доступно. (0x80070040) «.Пользователь'Сеанс s блокируется на период от 80 до 120 секунд (обычно около 100), прежде чем может быть выполнен следующий запрос, требующий доступа к сеансу чтения / записи.Дальнейшее копание в журнале, созданном IIS Failed Request Tracing, указывает на то, что AJAX POST падает такпосле состояние сеанса было заблокировано (во времяREQUEST_ACQUIRE_STATE
фаза), но так какREQUEST_RELEASE_STATE
фаза нене бывает, блокировка сеанса нет выпущен. Я'Я предполагаю, что тамкакой-то механизм безопасности в игре,Разблокировка сеанса через 80-120 секунд, но это очень длительное зависание явно нежелательно для моих пользователей.
У меня есть простой проект VS2012 / .Net 4.5 / MVC4, демонстрирующий проблему, доступную наhttps://github.com/jorupp/Ie9SessionCrash (имеет одну страницу, которая делает серию сообщений о действиях с помощью вызовов Sleep). IIS Failed Request Trace, показывающая проблему, находится в проекте по адресуhttps://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500.
Чтобы обойти эту проблему, мыМы планируем убедиться, что мы никогда не будем делать AJAX POST-вызовы для действий, требующих сеанса, и либо:
Использование GET звонков, где это возможноИспользование вызовов POST для контроллеров, которые имеютSessionState(SessionStateBehavior.ReadOnly)
приписывать.Есть ли лучший способ справиться с этим, или я пропускаю патч IIS / .Net по этому поводу? Или этот сценарий недействителен по какой-то другой причине? Я'я не решаюсь винить в этом структуру / IIS, но я думаю, чтомы устранили мой код, будучи виновным.