长时间运行ASP.NET时IIS请求超时


87

运行长时间的操作时,我正在从IIS请求超时。在后台,我的ASP.NET应用程序正在处理数据,但是正在处理的记录数量很大,因此该操作要花费很长时间。

但是,我认为IIS使会话超时。IIS或ASP.NET会话有问题吗?

提前致谢

Answers:


146

如果要延长ASP.NET脚本执行所允许的时间,请增加该Server.ScriptTimeout值。.NET 1.x的默认值为90秒,.NET 2.0及更高版本的默认值为110秒。

例如:

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

也可以web.confighttpRuntime配置元素的文件中配置此值:

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

在此处输入图片说明

请注意根据MSDN文档

“仅当编译元素中的debug属性为False时,此超时才适用。因此,如果debug属性为True,则不必将此属性设置为较大的值,以避免在调试时关闭应用程序。 ”

如果您已经完成此操作,但是发现会话即将到期,请增加ASP.NETHttpSessionState.Timeout值:

例如:

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

也可以web.configsessionState配置元素的文件中配置此值:

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

如果您的脚本执行需要几分钟,并且有许多并发用户,则可以考虑将页面更改为“异步页面”。这将增加应用程序的可伸缩性。

如果您具有服务器的管理员访问权限,另一种选择是将此长期运行的操作视为实现为计划任务或Windows服务的候选对象。


仅供参考,httpRuntime executeTimeout以秒为单位,并且没有大写字母T
Andrew Rimmer 2012年

7
同样重要的是要注意,将调试模式设置为false以便使用此超时值:<system.web> <compilation debug =“ false” targetFramework =“ 4.0” /> </ system.web>
Jesse罗珀2012年

@JesseRoper如果您可以将我指向该文档,那么我很乐意将其包含在答案中,或者您可以直接编辑我的答案。助教。
2012年

默认执行超时值为110秒。
frattaro 2015年

20

伟大而详尽的答案@Kev!

由于我只在WebForms应用程序的一个管理页面中进行了长时间处理,因此我使用了code选项。但是为了允许临时快速修复产品,我<location>在web.config中的标记中使用了config版本。这样,我的管理/处理页面有足够的时间,而最终用户的页面等却保留了他们的旧时间行为。

下面,我为您提供了需要同样快速修复的Googlers配置。你应该ofcourse使用其他值比我的'4小时的例子,但DO注意到,本次会议timeOut是在几分钟内,而要求executionTimeout是在几秒钟!

并且-因为已经是2015年-对于非快速修复,您应该尽可能使用.Net 4.5的async / await,而不是.NET 2.0的ASYNC页面,这是2010年KEV回答时的最新技术:)。

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

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

我在我的web.config中包含了“位置”代码段,但是它不起作用。我仅使用“ executionTimeout”,不需要“ sessionState”。我是否需要配置其他内容。我正在使用NET 4.0。如果我直接在“ system.web”中使用“ httpRuntime”,它将在所有页面中正确应用超时。
奥利弗(Oliver)

11

我将其发布在这里,因为我在上面花了3到4个小时,而我只找到了与上述回答类似的答案,说确实添加了executionTime,但是在这种情况下并不能解决问题您正在使用ASP .NET Core。为此,这将起作用:

在web.config文件中,requestTimeoutaspNetCore节点上添加属性。

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

在此示例中,我将值设置为10分钟。

参考:https : //docs.microsoft.com/zh-cn/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module


这仅适用于OutOfProcess托管模型。因为InProcess没有超时设置。IIS将继续等待该过程完成,请在此处引用:github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim

-9

删除~位置字符,以便

path="~/Admin/SomePage.aspx"

变成

path="Admin/SomePage.aspx"

它没有回答问题
Igor,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.