Час очікування запиту IIS при тривалій роботі ASP.NET


87

У мене триває час очікування запиту від IIS, коли я виконую тривалу операцію. За кулісами моя програма ASP.NET обробляє дані, але кількість записів, що обробляються, велика, і, отже, операція триває довго.

Однак, я думаю, IIS вичерпує час сесії. Це проблема з сеансом IIS або ASP.NET?

Спасибі заздалегідь

Відповіді:


146

Якщо ви хочете продовжити час, дозволений для виконання сценарію ASP.NET, збільште Server.ScriptTimeoutзначення. Типовим значенням є 90 секунд для .NET 1.x та 110 секунд для .NET 2.0 та новіших версій.

Наприклад:

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

Це значення також можна налаштувати у вашому web.configфайлі в httpRuntimeелементі конфігурації:

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

введіть тут опис зображення

Зверніть увагу, згідно з документацією MSDN :

"Цей тайм-аут застосовується лише в тому випадку, якщо атрибут налагодження в елементі компіляції має значення False. Тому, якщо атрибут налагодження має значення True, вам не потрібно встановлювати цей атрибут великим значенням, щоб уникнути завершення роботи програми під час налагодження. "

Якщо ви вже зробили це, але виявили, що термін дії вашого сеансу закінчується, збільште HttpSessionState.Timeoutзначення ASP.NET :

Наприклад:

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

Це значення також можна налаштувати у вашому web.configфайлі в sessionStateелементі конфігурації:

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

Якщо для виконання вашого сценарію потрібно кілька хвилин, і одночасно існує багато користувачів, то подумайте про зміну сторінки на асинхронну сторінку . Це збільшить масштабованість вашої програми.

Іншою альтернативою, якщо у вас є доступ адміністратора до сервера, є розгляд цієї тривалої операції як кандидата на виконання як запланованого завдання чи служби Windows.


FYI httpВиконання часу Тайм-аут у секундах і не має великих букв Т
Ендрю Ріммер

7
Важливо також зазначити, що для режиму налагодження потрібно встановити значення false, щоб використовувати це значення часу очікування: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper

@JesseRoper, якщо ти можеш вказати мені документи на цю тему, тоді я з радістю включу це у відповідь, або ти можеш відредагувати мою відповідь безпосередньо. Та
Кев

Значення тайм-аут виконання за замовчуванням - 110 секунд.
frattaro

20

Чудова та вичерпна відповідь від @Kev!

Оскільки я тривалий час обробляв лише одну сторінку адміністратора в програмі WebForms, я використав опцію коду. Але, щоб дозволити тимчасове швидке виправлення на виробництві, я використав версію конфігурації в <location>тезі в web.config. Таким чином моя адміністраторська сторінка / сторінка обробки отримала достатньо часу, тоді як сторінки для кінцевих користувачів та подібні зберігали свою попередню поведінку.

Нижче я дав конфігурацію для вас, працівники Google, які потребують того самого швидкого виправлення. Ви, звичайно, повинні використовувати інші значення, крім мого прикладу "4 години", але ЗВЕРНІТЬ , що сеанс timeOut- за хвилини, а запит executionTimeout- за секунди!

І - оскільки це вже 2015 рік - для НЕ-швидкого виправлення ви повинні використовувати асинхронізацію / очікування зараз .Net 4.5, якщо це можливо, замість сторінки ASYNC .NET 2.0, яка була найсучаснішою, коли KEV відповів у 2010 році. :).

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

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

Я включив фрагмент "location" у свій web.config, але він не працює. Я використовую лише "ExecuTimeout", мені не потрібен "sessionState". Чи потрібно налаштовувати щось інше. Я використовую NET 4.0. Якщо я використовую "httpRuntime" безпосередньо в "system.web", це застосовує тайм-аут правильно на всіх сторінках.
Олівер

11

Я розміщую це тут, тому що витратив на це близько 3-х та 4-х годин, і знайшов лише відповіді, подібні до тих, що наведені вище, які говорять, що додайте executionTime, але це не вирішує проблему у випадку, коли ви використовуєте ASP .NET Core . Для цього це працювало б:

У файлі web.config додайте requestTimeoutатрибут у aspNetCoreвузлі.

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

У цьому прикладі я встановлюю значення на 10 хвилин.

Посилання: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module


Це стосується лише OutOfProcessмоделі хостингу. Бо InProcessне встановлено тайм-аут. IIS буде продовжувати чекати завершення процесу, посилання тут: github.com/dotnet/AspNetCore.Docs/issues/16870
Росді Касім

-9

Видаліть ~символ з місця так

path="~/Admin/SomePage.aspx"

стає

path="Admin/SomePage.aspx"

Це не відповідає на питання
Ігор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.