Recently, I’ve noticed that my website is getting hit by a crawler, which takes a very long time to open the pages. I never thought about it before but realized now that my MVC3 application never times out. For example, if I put in a Thread.Sleep(1000 * 60 * 10) (ten minutes) in my controller action and I open the page, after 10 minutes I will get rendered view.
I’ve read tons of articles and SO questions but no luck. I tried the solutions below on both localhost, and production server with “Release” built, but none of those did what I wanted it to do.
Solution 1:
In web.config:
<location path="ControllerName/ActionName">
<system.web>
<httpRuntime executionTimeout="1" />
</system.web>
</location>
Solution 2:
In the controller action
HttpContext.Server.ScriptTimeout = 1;
The only idea I had left was to calculate the time that elapsed since the request came in and compare it to current time and if it’s bigger than my timeout limit, throw and TimeoutException() manually. I planned to put it in “OnActionExecution” and “OnActionExecuted” but if the request gets stuck somewhere in between those, I will never be able to tell if I should time it out.
Is there a good solution to implement this? Did anyone ever get request timeout to work in MVC3?
I don’t think the timeout is a real problem here. I have a very strong suspicion that your site is hitting session locking issue, which is typical when being hammered by lots of simultaneous requests from the same source. Make sure you disable or mark session as readonly by default and only enable it on the actions where session is modified (like login controller for instance). See
SessionStateAttributefor details.