长时间 ASP.NET 操作的 IIS 请求超时

Posted

技术标签:

【中文标题】长时间 ASP.NET 操作的 IIS 请求超时【英文标题】:IIS Request Timeout on long ASP.NET operation 【发布时间】:2011-04-19 06:08:58 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

如果您想延长允许 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.config文件的httpRuntime配置元素中配置:

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

请注意按MSDN documentation:

"此超时仅适用于编译中的调试属性 元素为假。因此,如果调试属性为 True,则执行 不必将此属性设置为较大的值以避免 调试时关闭应用程序。”

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

例如:

// 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>

如果您的脚本需要几分钟才能执行并且有许多并发用户,那么请考虑将页面更改为Asynchronous Page。这将增加您的应用程序的可扩展性。

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

【讨论】:

仅供参考 httpRuntime executionTimeout 以秒为单位,没有大写 T 同样重要的是要注意调试模式设置为 false 以便使用此超时值: @JesseRoper 如果您可以指向我的文档,那么我很乐意将其包含在答案中,或者您可以直接编辑我的答案。塔。 默认的 executionTimeout 值为 110 秒。【参考方案2】:

我在这里发布这个,因为我已经花了大约 3 和 4 个小时在上面,我只找到了像上面那些一样的答案,说要添加 executionTime,但它没有解决在您使用 ASP .NET Core 的情况下的问题。对于它,这将起作用:

在 web.config 文件中,在 aspNetCore 节点处添加 requestTimeout 属性。

<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【参考方案3】:

删除位置中的~ 字符 所以

path="~/Admin/SomePage.aspx"

变成

path="Admin/SomePage.aspx"

【讨论】:

它没有回答问题【参考方案4】:

@Kev 的精彩而详尽的回答!

由于我只在 WebForms 应用程序的一个管理页面中进行了长时间处理,因此我使用了代码选项。但是为了允许对生产进行临时快速修复,我在 web.config 的 &lt;location&gt; 标记中使用了配置版本。这样,我的管理/处理页面有足够的时间,而最终用户的页面等则保留了他们旧的超时行为。

下面我为需要同样快速修复的 Google 员工提供了配置。您当然应该使用除我的“4 小时”示例之外的其他值,但注意会话timeOut 以分钟为单位,而请求executionTimeout 以秒为单位!

而且 - 因为已经是 2015 年了 - 对于非快速修复,如果可能的话,您现在应该使用 .Net 4.5 的 async/await,而不是使用 KEV 时最先进的 .NET 2.0 的 ASYNC 页面在 2010 年回答:)。

<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 中包含了“位置”sn-p,但它不起作用。我只使用“executionTimeout”,不需要“sessionState”。我是否必须配置其他东西。我正在使用 NET 4.0。如果我直接在“system.web”中使用“httpRuntime”,它会在所有页面中正确应用超时。

以上是关于长时间 ASP.NET 操作的 IIS 请求超时的主要内容,如果未能解决你的问题,请参考以下文章

从 IIS 上的 ASP.NET Core 应用程序请求超时

IIS 和托管的 ASP.Net 应用程序

长时间运行的 ASP.NET MVC 核心控制器 HTTPPost 方法超时

ASP.NET Web API + 长时间运行的操作取消

Asp.Net各种超时问题总结

如何异步运行长时间运行的操作并在 ASP.Net Ajax 中为用户显示加载并轮询结果?