Tempo limite de solicitação do IIS em operação longa do ASP.NET


87

Estou tendo um tempo limite de solicitação do IIS quando executo uma operação longa. Nos bastidores, meu aplicativo ASP.NET está processando dados, mas o número de registros sendo processados ​​é grande e, portanto, a operação está demorando muito.

No entanto, acho que o IIS atinge o tempo limite da sessão. Este é um problema com a sessão IIS ou ASP.NET?

desde já, obrigado

Respostas:


146

Se você deseja estender o tempo permitido para a execução de um script ASP.NET, aumente o Server.ScriptTimeoutvalor. O padrão é 90 segundos para .NET 1.xe 110 segundos para .NET 2.0 e posterior.

Por exemplo:

// Increase script timeout for current page to five minutes
Server.ScriptTimeout = 300;

Este valor também pode ser configurado em seu web.configarquivo no httpRuntimeelemento de configuração:

<!-- Increase script timeout to five minutes -->
<httpRuntime executionTimeout="300" 
  ... other configuration attributes ...
/>

insira a descrição da imagem aqui

Observe de acordo com a documentação do MSDN :

"Este tempo limite se aplica apenas se o atributo debug no elemento de compilação for False. Portanto, se o atributo debug for True, você não precisa definir este atributo com um valor grande para evitar o desligamento do aplicativo durante a depuração. "

Se você já fez isso, mas está descobrindo que sua sessão está expirando, aumente o HttpSessionState.Timeoutvalor do ASP.NET :

Por exemplo:

// Increase session timeout to thirty minutes
Session.Timeout = 30;

Este valor também pode ser configurado em seu web.configarquivo no sessionStateelemento de configuração:

<configuration>
  <system.web>
    <sessionState 
      mode="InProc"
      cookieless="true"
      timeout="30" />
  </system.web>
</configuration>

Se o seu script estiver demorando vários minutos para ser executado e houver muitos usuários simultâneos, considere alterar a página para uma página assíncrona . Isso aumentará a escalabilidade do seu aplicativo.

A outra alternativa, se você tiver acesso de administrador ao servidor, é considerar essa operação de longa duração como um candidato para implementação como uma tarefa agendada ou um serviço do Windows.


FYI httpRuntime executionTimeout está em segundos e não tem T maiúsculo
Andrew Rimmer

7
Também é importante observar que o modo de depuração deve ser definido como falso para que este valor de tempo limite seja usado: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper

@JesseRoper se você puder me indicar os documentos sobre isso, ficarei feliz em incluir isso na resposta, ou você pode editar minha resposta diretamente. Ta.
Kev

O valor default de executionTimeout é 110 segundos.
frattaro,

20

Excelente e exaustiva resposta por @Kev!

Como eu processava muito apenas uma página de administração em um aplicativo WebForms, usei a opção de código. Mas para permitir uma correção rápida temporária na produção, usei a versão de configuração em uma <location>tag em web.config. Desta forma, minha página de administração / processamento teve tempo suficiente, enquanto as páginas para usuários finais e outras mantiveram seu comportamento antigo.

Abaixo, apresentei a configuração para vocês, Googlers, que precisam da mesma solução rápida. É claro que você deve usar outros valores além do meu exemplo de '4 horas', mas OBSERVE que a sessão timeOuté em minutos, enquanto a solicitação executionTimeoutestá em segundos!

E - já que é 2015 - para uma correção NÃO rápida, você deve usar async / await do .Net 4.5 agora, se possível, em vez da página ASYNC do .NET 2.0 que era o estado da arte quando a KEV respondeu em 2010 :).

<configuration>
    ... 
    <compilation debug="false" ...>
    ... other stuff ..

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>

Incluí o snippet "local" em meu web.config, mas ele não está funcionando. Estou usando apenas "runningTimeout", não preciso de "sessionState". Eu tenho que configurar algo mais. Estou usando o NET 4.0. Se eu usar "httpRuntime" diretamente em "system.web", ele aplicará o tempo limite corretamente em todas as páginas.
Oliver

11

Estou postando isso aqui, porque gastei umas 3 e 4 horas nisso, e só encontrei respostas como essas acima, que dizem para adicionar o executionTime, mas não resolve o problema no caso de você está usando ASP .NET Core . Para isso, isso funcionaria:

No arquivo web.config, adicione o requestTimeoutatributo no aspNetCorenó.

<system.webServer>
  <aspNetCore requestTimeout="00:10:00" ... (other configs goes here) />
</system.webServer>

Neste exemplo, estou definindo o valor para 10 minutos.

Referência: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module


Isso se aplica apenas ao OutOfProcessmodelo de hospedagem. Pois InProcessnão há configuração de tempo limite. O IIS continuará aguardando a conclusão do processo, consulte
Rosdi Kasim

-9

Remova o ~personagem do local para

path="~/Admin/SomePage.aspx"

torna-se

path="Admin/SomePage.aspx"

Não responde à pergunta
Igor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.