【问题标题】:How do I set the request timeout for one controller action in an asp.net mvc application如何在 asp.net mvc 应用程序中为一个控制器操作设置请求超时
【发布时间】:2010-10-09 10:26:15
【问题描述】:

我想为我的应用程序中的特定控制器操作增加请求超时。我知道我可以在整个应用程序的 web.config 中执行此操作,但我宁愿仅在这一操作上进行更改。

Web.config 示例:

<system.web>
  <httpRuntime executionTimeout="1000" /> 
</system.web>

我该怎么做?

【问题讨论】:

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

您可以在控制器中以编程方式设置:-

HttpContext.Current.Server.ScriptTimeout = 300;

将超时设置为 5 分钟,而不是默认的 110 秒(这是什么奇怪的默认设置?)

【讨论】:

  • 随着 AsyncController 的出现,值得记住的是,要为异步请求获得类似的效果,您应该使用 [AsyncTimeout] 属性。
  • 我对这个答案的问题是它如何真正只影响它所在的​​一个动作?那么在请求完成后,该设置是否会针对所有未来的请求恢复?
  • @jhilden HttpContext 是在每个请求的基础上实例化的,因此它将在下一个请求时恢复为默认值
  • 您可能想要添加 HttpContext.Current(缺少“Current”)
  • 我得到:“httpcontext 不包含当前的定义”。我正在使用 .NET Core 2.0。知道如何解决这个问题吗?
【解决方案2】:
<location path="ControllerName/ActionName">
    <system.web>
        <httpRuntime executionTimeout="1000"/>
    </system.web>
</location>

在 web.config 而不是控制器中设置这些值可能会更好。可配置选项的硬编码被认为是有害的。

【讨论】:

  • -1 对于 OP 所描述的特殊情况,硬编码是可以的。听起来一个特定的动作需要与其他动作不同的超时时间,所以在动作内部进行硬编码听起来是个好地方。
  • executionTimeout 不适用于 MVC - 这是错误的答案。看这里:forums.asp.net/p/1715081/…
  • 请注意,如果调试模式处于打开状态,则此操作将被忽略 msdn.microsoft.com/en-us/library/vstudio/… executionTimeout 可选 Int32 属性。指定请求在被 ASP.NET 自动关闭之前允许执行的最大秒数。此超时仅在编译元素中的调试属性为 False 时适用。因此,如果 debug 属性为 True,则不必将此属性设置为很大的值,以避免在调试时关闭应用程序。
  • 这不是最正确的答案,因为它具有更改所有其他控制器操作的执行超时的副作用。
  • @EricJ。仅在以 ControllerName\ActionName 开头的控制器路由中
【解决方案3】:

我必须使用 .NET 4.5 添加“当前”:

HttpContext.Current.Server.ScriptTimeout = 300;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2018-03-03
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多