2010-09-30 12 views
70

Występuje limit czasu żądania z usług IIS po uruchomieniu długiej operacji. Za sceną moja aplikacja ASP.NET przetwarza dane, ale liczba przetwarzanych rekordów jest duża, więc operacja zajmuje dużo czasu.Limit czasu żądania IIS podczas długiej operacji ASP.NET

Jednak myślę, że IIS przekracza sesję. Czy to jest problem z sesją IIS lub ASP.NET?

góry dzięki

Odpowiedz

123

Jeśli chcesz przedłużyć czas dozwolony dla scenariusza ASP.NET do wykonania następnie zwiększyć wartość Server.ScriptTimeout. Wartość domyślna to 90 sekund dla .NET 1.x i 110 sekund dla .NET 2.0 i nowszych.

Na przykład:

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

Wartość ta może być również skonfigurowane w pliku web.config w elemencie httpRuntime konfiguracji:

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

enter image description here

proszę zauważyć według MSDN documentation:

"Ten limit czasu ma zastosowanie tylko wtedy, gdy atrybut debugowania w elemencie kompilacji jest fałszywy. Dlatego też, jeśli atrybut debug to prawda, że ​​nie nie trzeba ustawić ten atrybut na dużą wartość w celu uniknięcia zamknięcie aplikacji podczas debugowania.”

Jeśli już to zrobione, ale są uznając, że sesja wygasa następnie zwiększyć ASP.NET HttpSessionState.Timeout wartość:

na przykład:

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

wartość ta może być również skonfigurowany w pliku web.config wt on sessionState elementu konfiguracji:

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

Jeśli skrypt trwa kilka minut, aby wykonać i istnieje wiele jednoczesnych użytkowników następnie rozważyć zmianę stronę do Asynchronous Page. Zwiększy to skalowalność twojej aplikacji.

Inną alternatywą, jeśli masz dostęp administratora do serwera, jest rozważenie tej długotrwałej operacji jako kandydata do wdrożenia jako zaplanowane zadanie lub usługa systemu Windows.

+0

FYI httpRuntime executionTimeout jest w sekundach i ma wielką T –

+6

Ważne jest również, aby pamiętać, że tryb debugowania być ustawiona na false, aby ta wartość limitu czasu do wykorzystania:

+0

@JesseRoper, jeśli możesz wskazać mi dokumenty na ten temat, to z chęcią uwzględnię to w odpowiedzi lub możesz bezpośrednio edytować moją odpowiedź. Ta. – Kev

17

Świetna i wyczerpująca answerby @Kev!

Ponieważ długo przetwarzałem tylko na jednej stronie administratora w aplikacji WebForms, skorzystałem z opcji kodu. Aby umożliwić tymczasową szybką korektę produkcji, użyłem wersji konfiguracyjnej w tagu <location> w web.config. W ten sposób moja strona admin/processing miała wystarczająco dużo czasu, podczas gdy strony dla użytkowników końcowych i tak zachowywały dawne zachowanie.

Poniżej podałem konfigurację dla pracowników Google potrzebujących tej samej szybkiej poprawki.Powinieneś użyć innych wartości niż mój przykład "4 godziny", ale DO zwróć uwagę, że sesja timeOut jest w ciągu kilku minut, podczas gdy żądanie executionTimeout jest w sekundach!

I - ponieważ już w 2015 r. - w przypadku NON-quickfix należy teraz używać .Net 4.5's async/await teraz, jeśli to możliwe, zamiast strony .NET 2.0 ASYNC, która była aktualna, gdy KEV odpowiedział w 2010 :).

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

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

Zawarłem fragment kodu "location" w moim pliku web.config, ale nie działa. Używam tylko "executionTimeout", nie potrzebuję "sessionState". Czy muszę skonfigurować coś innego? Używam NET 4.0. Jeśli użyję "httpRuntime" bezpośrednio w "system.web", to poprawnie zastosuje limit czasu na wszystkich stronach. – Oliver

-2

Usuń ~ znak w miejscu tak

path="~/Admin/SomePage.aspx" 

staje

path="Admin/SomePage.aspx" 
2

jestem delegowania to tutaj, ponieważ spędziłem jak 3 i 4 godziny na nim, i Znalazłem tylko odpowiedzi podobne do powyższych, które mówią: dodaj executionTime, ale to nie rozwiązuje problemu w przypadku, gdy używasz ASP .NET Core. W tym celu działałoby to:

W pliku web.config dodaj atrybut requestTimeout w węźle aspNetCore.

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

W tym przykładzie ustawiam wartość na 10 minut.

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

Powiązane problemy