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:
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?