Erro durante GENERAL_REQUEST_ENTITY para resultados de POST no estado de sessão ASP .NET que nunca é desbloqueado

4

Eu tenho tentado perseguir a causa raiz de uma condição em que o estado da sessão ASP .NET permanece bloqueado depois que uma solicitação da Web foi encerrada devido a um erro inesperado. Usamos o provedor de estado de sessão do SQL Server para a sessão porque temos vários servidores em um farm da web. Esse problema foi apresentado pela primeira vez na forma de muitos pedidos ficando presos no evento 'AcquireRequestState' de seu ciclo de vida sem nenhum motivo aparente. Consegui encontrar entradas correspondentes para essas solicitações no banco de dados de estado da sessão no SQL Server que estavam todas bloqueadas (coluna Locked = 1). Eu também era capaz de correlacionar essas solicitações para entradas no log do IIS com códigos de status HTTP de 500 (com um sub status de 0). Essas descobertas levaram-me a acreditar que, em alguns casos, uma solicitação estava errando, mas NÃO estava liberando seu bloqueio no estado da sessão como deveria.

Eu habilitei o Rastreamento de Solicitações Falhadas no IIS para o site em questão para o código de status 500, com todos os provedores disponíveis selecionados, cada um com a configuração 'Verbosa' para verbosidade. Desde então, reuni vários rastreios com falha que causaram sessões ASP.NET permanentemente bloqueadas. Todos compartilham as mesmas características:

  • São todas as solicitações "POST" nas quais o navegador está postando dados para serem processados / salvos.
  • Todos eles têm eventos indicando que o módulo 'Sessão' foi chamado durante o evento REQUEST_ACQUIRE_STATE. Neste ponto, a solicitação teria marcado a linha no banco de dados de estado da sessão como sendo "bloqueada". Isso é normal e esperado.
  • Todos eles têm entradas GENERAL_READ_ENTITY_START, GENERAL_READ_ENTITY_END e GENERAL_REQUEST_ENTITY que parecem estar lendo nos dados que foram postados no servidor como parte da solicitação. Essa parece ser uma operação em buffer, pois esses eventos são repetidos várias vezes, com cada um lendo em algum subconjunto dos dados postados.
  • Em algum momento durante a 'entidade de leitura' ocorrem eventos e erros. Alguns têm o código de erro "Função incorreta. (0x80070001)" e outros têm "A operação de E / S foi anulada devido a uma saída de thread ou a um pedido de aplicativo. (0x800703e3)".
  • Quando o erro é encontrado, todos eles pulam diretamente para os eventos END_REQUEST.

O problema aqui é que, em circunstâncias normais, deve haver um evento RELEASE_REQUEST_STATE que permitirá que o módulo Session libere o bloqueio que ele tem na sessão. Este evento está sendo ignorado neste cenário. Só para garantir, habilitei o rastreamento de solicitação com falha para o código de status '200' e gerou vários rastreamentos de solicitações bem-sucedidas que têm o evento RELEASE_REQUEST_STATE sendo manipulado pelo módulo Session.

Minha teoria neste ponto é que algum tipo de problema de rede está causando a 'função incorreta' e 'operação de E / S foi anulada devido a erros de saída de thread ou solicitação de aplicativo', mas eu não entendo Por que isso parece estar fazendo com que o tratamento de solicitação pule o evento RELEASE_REQUEST_STATE. Se o pedido foi submetido a REQUEST_ACQUIRE_STATE, parece que ele também deve acionar RELEASE_REQUEST_STATE. Eu detesto dizer que isso é um bug no IIS ou no ASP .NET, mas certamente parece ser assim para mim neste momento.

Há alguma alteração de configuração que eu possa fazer para ajudar a garantir que 'RELEASE_REQUEST_STATE' seja acionado sob todas as condições de erro?

    
por Jesse 14.10.2013 / 23:01

0 respostas

Tags