Тайм-аут запроса 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 httpRuntime executionTimeout указывается в секундах и не имеет верхнего регистра T
Эндрю Риммер,
7
Также важно отметить, что для режима отладки должно быть установлено значение false, чтобы использовалось это значение тайм-аута: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Джесси Roper
@JesseRoper, если вы можете указать мне на документы по этому поводу, я был бы рад включить это в ответ, или вы можете напрямую отредактировать мой ответ. Та.
Kev
Значение executionTimeout по умолчанию - 110 секунд.
frattaro
20

Отличный и исчерпывающий ответ @Kev!

Поскольку я выполнял долгую обработку только на одной странице администратора в приложении WebForms, я использовал вариант кода. Но чтобы разрешить временное быстрое исправление на производстве, я использовал версию конфигурации в <location>теге в web.config. Таким образом, моя страница администратора / обработки получила достаточно времени, в то время как страницы для конечных пользователей и тому подобное сохранили свое старое поведение при тайм-ауте.

Ниже я привел конфигурацию для вас, гуглеров, нуждающихся в таком же быстром исправлении. Конечно, вы должны использовать другие значения, кроме моего примера «4 часа», но ОБЯЗАТЕЛЬНО обратите внимание, что сеанс timeOutвыполняется в минутах, а запрос executionTimeout- в секундах!

И - поскольку это уже 2015 год - для NON-quickfix вы должны использовать async / await .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, но он не работает. Я использую только «executionTimeout», мне не нужно «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"
Саду
источник
Не отвечает на вопрос
Игорь