Somos capazes de recriar com segurança o seguinte cenário:
- Crie uma pequena página HTML que faça solicitações AJAX a um servidor (usando HTTP POST)
- Desconecte-se da rede e reconecte-se
- Monitore os pacotes que o IE gera após a falha
Após uma falha na conexão de rede, o IE faz a próxima solicitação AJAX, mas envia apenas o cabeçalho HTTP (não o corpo) ao fazer a postagem HTTP. Isso causa todos os tipos de problemas no servidor, pois é apenas uma solicitação parcial. Pesquise no Google esse problema com o Bing e você encontrará muitas pessoas reclamando de "erros aleatórios do servidor" usando AJAX ou falhas inexplicáveis de AJAX.
Sabemos que o IE (ao contrário da maioria dos outros navegadores) sempre envia um HTTP POST como DOIS pacotes TCP / IP. O cabeçalho e o corpo são enviados separadamente. No caso diretamente após uma falha, o IE apenas envia o cabeçalho . O IE nunca envia a carga útil e o servidor eventualmente responde com um tempo limite.
Portanto, minha pergunta é - por que isso se comporta dessa maneira? Parece errado com base na especificação HTTP e outros navegadores não se comportam dessa maneira. É simplesmente um bug? Certamente isso cria confusão em qualquer aplicativo da Web baseado em AJAX sério.
Informação de referência:
Há um problema semelhante, acionado por tempos limites de HTTP keep-alive menores que 1 minuto e está documentado aqui:
fonte
Respostas:
Não parece haver uma resposta clara para essa pergunta, portanto, fornecerei meus dados empíricos como um substituto e apresentarei algumas maneiras de contorná-los. Talvez algum insider da MS algum dia lance alguma luz sobre isso ...
Se HTTP Keep-Alive estiver desabilitado no servidor, esse problema desaparece. Em outras palavras, seu servidor HTTP 1.1 responderá a cada solicitação Ajax com uma
Connection: Close
linha na resposta. Isso mantém o IE feliz, mas faz com que cada solicitação Ajax abra uma nova conexão. Isso pode ter um impacto significativo no desempenho, especialmente em redes de alta latência.O problema é acionado facilmente se as solicitações Ajax forem feitas em rápida sucessão. Por exemplo, fazemos solicitações Ajax a cada 100 ms e, em seguida, o status da rede muda, o erro é fácil de reproduzir. Embora a maioria dos aplicativos provavelmente não faça essas solicitações, você pode muito bem ter algumas chamadas de servidor acontecendo uma após a outra, o que pode levar a esse problema. Menos tagarela mantém o IE feliz.
Isso acontece mesmo sem autenticação NTLM.
Isso acontece quando o tempo limite de HTTP keep-alive no servidor é menor do que o padrão (que é de 60 segundos no Windows). Detalhes fornecidos no link em questão.
Isso não acontece com o Chrome ou Firefox. O FF envia um pacote, portanto, parece evitar esse problema por completo.
Isso acontece no IE 6, 7, 8. Não foi possível reproduzir com o IE 9 beta.
fonte
O artigo da Microsoft KB intitulado Quando você usa o Microsoft Internet Explorer ou outro programa para executar uma operação de re-POST, apenas os dados do cabeçalho são postados parece corrigir esse problema.
O artigo fornece um hotfix. Para navegadores posteriores, como o IE8, ele informa que o hotfix já está incluído, mas precisa ser ativado nas configurações do registro no PC cliente.
fonte
Eu tive um problema semelhante, onde algumas versões mais antigas do IE enviariam de volta apenas o cabeçalho e não o corpo de um POST. Meu problema acabou por ser relacionado ao IE e NTLM. Já que você não mencionou NTLM, isso provavelmente não ajuda, mas apenas no caso:
http://support.microsoft.com/kb/251404
fonte
Esta é uma hipótese remota, mas o IE (e até o Firefox) às vezes "se lembra" da conexão que usa para uma solicitação HTTP. Notas / exemplos:
No Firefox, se eu alterar as configurações de proxy e clicar em SHIFT-RELOAD em uma página, ele ainda usará o proxy antigo. No entanto, se eu matar o proxy antigo ("killall squid"), ele começará a usar o novo proxy.
Ao desconectar / reconectar, você recebe um novo endereço IP ou algo semelhante? Você pode de alguma forma monitorar o endereço IP antigo para ver se o IE está enviando dados para aquele endereço agora morto?
Meu palpite é que o IE está enviando os dados, apenas pelo caminho errado. Pode ser inteligente o suficiente para não armazenar em cache as conexões de rede para pacotes "POST", mas pode não ser inteligente o suficiente para fazer isso para cargas úteis POST.
Isso provavelmente não afeta a maioria dos aplicativos AJAX, já que as pessoas raramente se desconectam e se reconectam às suas redes.
fonte
Você está usando autenticação NTLM?
Ao usar a autenticação NTLM, o IE não envia pós-dados. Ele envia informações de cabeçalho, espera uma resposta não autorizada, envia autorização e, após a 'reautenticação', envia a postagem.
fonte
Tive um problema semelhante hoje ao usar $ .ajax e consegui corrigi-lo definindo async como false.
fonte