ManagedPipelineHandler para um AJAX POST falha se um usuário do IE9 sair de uma página enquanto a chamada estava em andamento

Cenário:

O usuário está usando o IE9 (IE8 / 10 não afetado).O usuário tem uma sessão ativa.Página inicia um pedido AJAX POST (GET não afetado) para um controlador com oSessionState(SessionStateBehavior.Required) atributo (ReadOnly não afetado). Algo impede que esse pedido seja processado imediatamente (como outra solicitação em andamento com a sessão bloqueada).Enquanto o AJAX POST está em andamento, o usuário navega para fora da página (GET ou POST - não importa)

Resultado:

O AJAX POST termina e retorna um HTTP 500 (que o navegador deixou de atender, mas você pode vê-lo nos logs do IIS). IIS Failed Request Rastreamento mostra que o erro é "O nome da rede especificado não está mais disponível. (0x80070040)."A sessão do usuário é bloqueada para algo entre 80 e 120 segundos (geralmente em torno de 100) antes que a próxima solicitação que requer acesso à sessão de leitura / gravação possa ser executada.

Mais escavações no log criado pelo IIS Failed Request Tracing indica que o AJAX POST falha assimdepois de o estado da sessão foi bloqueado (durante oREQUEST_ACQUIRE_STATE fase), mas desde aREQUEST_RELEASE_STATE fase não acontece, o bloqueio de sessão não é liberado. Eu estou supondo que há algum mecanismo de segurança em jogo que está desbloqueando a sessão após 80-120 segundos, mas esse tempo muito longo é obviamente indesejado para meus usuários.

Eu tenho um projeto VS2012 / .Net 4.5 / MVC4 simples demonstrando o problema disponível emhttps://github.com/jorupp/Ie9SessionCrash (tem uma página que faz uma série de posts para ações com chamadas do Sleep). O rastreamento de solicitação falha do IIS mostrando o problema está no projeto emhttps://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500.

Para contornar o problema, estamos planejando garantir que nunca façamos chamadas AJAX POST para ações que exijam sessão e também:

Usando chamadas GET, quando possívelUsando chamadas POST para controladores que possuemSessionState(SessionStateBehavior.ReadOnly) atributo.

Existe uma maneira melhor de lidar com isso ou estou faltando um patch do IIS / .net em relação a isso? Ou este cenário não é válido por algum outro motivo? Eu hesito em culpar o framework / IIS por isso, mas acho que eliminei meu código com falha.

questionAnswers(2)

yourAnswerToTheQuestion