0

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

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

解决方案1:

在 web.config 中:

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

解决方案2:

在控制器动作中

HttpContext.Server.ScriptTimeout = 1;

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

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

4

2 回答 2

1

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

于 2012-12-14T19:47:03.237 回答
-1

很好的答案: 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>
于 2012-12-15T04:47:17.387 回答