【问题标题】:How to time out request/connection如何超时请求/连接
【发布时间】:2012-12-14 19:36:25
【问题描述】:

最近,我注意到我的网站被爬虫攻击,这需要很长时间才能打开页面。我以前从未想过,但现在意识到我的 MVC3 应用程序永远不会超时。例如,如果我在控制器操作中输入Thread.Sleep(1000 * 60 * 10)(十分钟)并打开页面,10 分钟后我将获得渲染视图。

我已经阅读了大量文章和 SO 问题,但没有运气。我在 localhost 和构建了“Release”的生产服务器上尝试了以下解决方案,但这些解决方案都没有达到我想要的效果。

解决方案一:

在 web.config 中:

<location path="ControllerName/ActionName">
    <system.web>
        <httpRuntime executionTimeout="1" />
    </system.web>
</location>

解决方案 2:

在控制器动作中

HttpContext.Server.ScriptTimeout = 1;

我剩下的唯一想法是计算自请求进入以来经过的时间并将其与当前时间进行比较,如果它大于我的超时限制,则手动抛出和 TimeoutException()。我计划将它放在“OnActionExecution”和“OnActionExecuted”中,但如果请求卡在它们之间的某个地方,我将永远无法判断我是否应该超时。

有没有很好的解决方案来实现这一点?有人在 MVC3 中工作时遇到过请求超时吗?

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 为什么你的行动需要这么长时间才能开始?也许这是需要改进的地方?
  • 操作正常。但看起来这个爬虫是故意放慢自己的速度。

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

我不认为超时在这里是一个真正的问题。我非常怀疑您的网站遇到了会话锁定问题,这在受到来自同一来源的大量同时请求的影响时很典型。确保默认禁用会话或将会话标记为只读,并且仅在修改会话的操作上启用它(例如登录控制器)。详情请见SessionStateAttribute

【讨论】:

  • 你为什么这么认为?它与允许一个请求“永远”存在有什么关系
  • @bobek 你正在运行一个爬虫。您的页面突然花费的时间比预期的要长。这几乎肯定是会话锁定问题。它与故意阻止其中一个请求有关一切。同一用户(会话)发出的其他请求将被阻止,直到第一个请求完成。
  • @bobek 尝试简单的实验。采取 2 个空操作并将 Thread.Sleep(10000) 添加到第一个操作。执行第一个。然后在不同的浏览器窗口中执行第二个。观察两者都被阻止。现在将控制器设置为“会话状态 = 只读”并重复。观察只有第一个被阻止。
【解决方案2】:

这里的答案很好: IIS Request Timeout on long ASP.NET operation

如果您已经这样做了,但发现您的会话即将到期,请增加 ASP.NET HttpSessionState.Timeout 值:

例如:

// Increase session timout to thirty minutes
Session.Timout = 30;

这个值也可以在你的 web.config 文件中的 sessionState 配置元素中配置:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2015-08-14
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多