Pytanie Czas oczekiwania na żądanie IIS podczas długiej operacji ASP.NET


Wystąpił limit czasu żądania z IIS, gdy prowadzę długą operację. Za sceną moja aplikacja ASP.NET przetwarza dane, ale liczba przetwarzanych rekordów jest duża, więc operacja zajmuje dużo czasu.

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

Z góry dziękuję


76
2017-09-30 09:06


pochodzenie




Odpowiedzi:


Jeśli chcesz wydłużyć dozwolony czas na wykonanie skryptu ASP.NET, zwiększ wartość Server.ScriptTimeout wartość. 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;

Ta wartość może być również skonfigurowana w twoim web.config plik w httpRuntime element konfiguracji:

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

enter image description here

Uwaga zgodnie z Dokumentacja MSDN:

"Ten limit czasu dotyczy tylko atrybutu debugowania w kompilacji   element jest fałszywy. Dlatego jeśli atrybut debugowania ma wartość True, robisz to   nie trzeba ustawiać tego atrybutu na dużą wartość, aby uniknąć   zamykanie aplikacji podczas debugowania. "

Jeśli już to zrobiłeś, ale okazało się, że sesja wygasła, zwiększ ją ASP.NET HttpSessionState.Timeout wartość:

Na przykład:

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

Ta wartość może być również skonfigurowana w twoim web.config plik w sessionState element konfiguracji:

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

Jeśli twój skrypt zajmuje kilka minut, a jest wielu użytkowników jednocześnie, rozważ zmianę strony na Strona asynchroniczna. 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 implementacji jako zaplanowanego zadania lub usługi Windows.


131
2017-09-30 13:02



FYI httpRuntime executionTimeout jest w sekundach i nie zawiera wielkich liter T - Andrew Rimmer
Ważne jest również, aby ustawić tryb debugowania na false, aby ta wartość limitu czasu była używana: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web> - Jesse Roper
@JesseRoper, jeśli możesz wskazać mi dokumenty na ten temat, z przyjemnością uwzględnię to w odpowiedzi lub możesz bezpośrednio edytować moją odpowiedź. Ta. - Kev
Domyślna wartość executionTimeout wynosi 110 sekund. - frattaro


Świetna i wyczerpująca answerby @Kev!

Ponieważ długo przetwarzałem tylko na jednej stronie administratora w aplikacji WebForms, skorzystałem z opcji kodu. Ale aby umożliwić tymczasową szybką korektę produkcji, użyłem wersji konfiguracyjnej w a <location> tag 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 was, Googlersów, potrzebujących tej samej szybkiej poprawki. Powinieneś użyć innych wartości niż mój "4-godzinny" przykład, ale ZROBIĆ zauważ, że sesja timeOut jest w ciągu kilku minut, a żądanie executionTimeout jest w sekundach!

I - ponieważ już jest 2015 - dla NON-quickfix powinieneś użyć .Net 4.5 async / czekaj teraz, jeśli to możliwe, zamiast strony ASYNC .NET 2.0, która była najnowocześniejsza, gdy KEV odpowiedział w 2010 r. :).

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

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

20
2018-02-01 11:07



W moim web.config umieściłem fragment kodu "location", 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


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

W pliku web.config dodaj requestTimeout atrybut at aspNetCore węzeł.

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

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

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


3
2018-06-19 15:29





Usunąć ~ postać w lokalizacji więc

path="~/Admin/SomePage.aspx"

staje się

path="Admin/SomePage.aspx"

-4
2017-10-28 20:08