最近,我注意到我的网站受到了爬虫的攻击,这需要很长时间才能打开页面。我以前从未想过它,但现在意识到我的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中工作?
答案 0 :(得分:1)
我不认为超时是一个真正的问题。我非常怀疑您的网站遇到了会话锁定问题,这种情况在同一来源的大量同时请求遭到重创时很常见。确保默认情况下禁用或标记会话为只读,并且仅在修改会话的操作(例如登录控制器)上启用它。有关详细信息,请参阅SessionStateAttribute
。
答案 1 :(得分:-1)
这里的答案很好: IIS Request Timeout on long ASP.NET operation
如果您已经完成此操作但发现会话即将到期,则增加ASP.NET HttpSessionState.Timeout值:
例如:
// Increase session timout to thirty minutes
Session.Timout = 30;
此值也可以在sessionState配置元素的web.config文件中配置:
<configuration>
<system.web>
<sessionState
mode="InProc"
cookieless="true"
timeout="30" />
</system.web>
</configuration>