我们最近才注意到executionTimeout在我们的网站上已经停止工作了。它肯定是工作的~去年...很难说它什么时候停止的。
我们当前正在运行:
- Windows-2008x64
- IIS7
- 32位二进制文件
- 托管管道模式=经典
- 框架版本= v2.0
Web.Config具有
<compilation defaultLanguage="vb" debug="false" batch="true">
<httpRuntime executionTimeout="90" />
有什么提示可以解释为什么我们会看到Timetaken一直到~20分钟。DebugType的编译选项(full vs pdbonly)会有什么影响吗?
datetime timetaken httpmethod Status Sent Received<BR>
12/19/10 0:10 901338 POST 302 456 24273<BR>
12/19/10 0:18 1817446 POST 302 0 114236<BR>
12/19/10 0:16 246923 POST 400 0 28512<BR>
12/19/10 0:12 220450 POST 302 0 65227<BR>
12/19/10 0:22 400150 GET 200 180835 416<BR>
12/19/10 0:20 335455 POST 400 0 36135<BR>
12/19/10 0:57 213210 POST 302 0 51558<BR>
12/19/10 0:48 352742 POST 302 438 25802<BR>
12/19/10 0:37 958660 POST 400 0 24558<BR>
12/19/10 0:06 202025 POST 302 0 58349<BR>
4条答案
按热度按时间9cbw7uwe1#
执行超时和耗时是两个不同的概念。尽管如此,差异的大小令人不安。
time-taken包括请求/响应中的所有网络时间(在特定的conditions.下)。网络传输时间很容易超过请求实际花费的时间。尽管,通常,我习惯于只相差几秒而不是几分钟。
执行超时仅指辅助进程处理请求所花费的时间;这只是耗时的一个子集。它只适用于debug attribute is set to false;看起来你已经有了
当然,假设您列出的第一个请求占用了90秒的允许超时时间,那么在传输24 k数据的时间窗口中仍然剩下13.5分钟。这听起来是一个严重的网络问题。
因此,要么您有一个严重的传输问题,要么在树中的某个地方存在另一个web.config文件,在该文件中处理的请求要么将debug设置为true,要么将执行超时增加到天文数字。
另一种可能性是页面本身设置了debug属性或它自己的超时值。
yvgpqqbh2#
我有一个理论,但我不确定如何证明它。我做了一些类似于cbcolin的事情,并记录了请求从
BeginRequest
事件处理程序中开始的时间。然后当请求超时时(在我们的情况下是1小时后),它被记录在数据库中并记录了时间戳。理论是这样的:ASP.NET只计算线程实际执行的时间,而不计算线程休眠的时间。
因此,在
BeginRequest
之后,线程进入睡眠状态,直到IIS接收到整个POST主体。然后,线程被唤醒并开始工作,executionTimeout
时钟开始运行。因此,在网络传输阶段花费的时间不会计入executionTimeout
。最终,站点范围的连接超时被命中,IIS关闭连接,导致ASP.NET中的异常。BeginRequest
甚至PreRequestHandlerExecute
都在POST主体被传输到Web服务器之前被调用。然后在请求处理程序被调用之前有一个很长的间隙。所以看起来可能像.NET有30分钟的请求,但线程并没有运行那么长时间。我将开始记录请求处理程序实际开始运行的时间,看看它是否超过了我设置的限制。
现在,关于控制一个请求可以在每个URL的基础上在传输阶段停留多长时间,我不知道。在全局层面上,我们可以在webLimits中为应用程序设置minBytesPerSecond。我找不到它的UI。这应该会在传输阶段踢出超慢的客户端。
这仍然不能解决实际发送数据的DoS攻击的问题。
piztneat3#
我遇到了这篇文章2天前,当我有同样的问题.我尝试了一切,它在我的本地机器上工作,但没有在生产服务器上工作.今天,我有一个解决方案,解决了这个问题,并希望分享.微软似乎没有应用超时IHttpAsyncHandler,我利用这一点.在我的系统上,我只有1处理程序是耗时的,所以这个解决方案很适合我。我的处理程序代码如下所示:
我的助手类:
在这种方法中,我们实际上没有做任何异步的事情。
AsynchOperation
只是一个假的异步任务。我所有的业务逻辑仍然在主线程上执行,这不会改变当前代码的任何行为。zzwlnbp84#
IIS执行超时停止工作(pre-Core)ASP.NET在内部HTTP操作变为异步之后。当HTTP操作是同步的时,运行时只是观察请求的线程存活了多长时间,如果太长就杀死它,这是可行的,因为一个线程总是绑定到一个请求。但是一旦框架发展到HTTP操作变为异步的时候,超时模型不再起作用,因为一个线程最终要处理多个请求,所以你不能在某个时间后安全地杀死一个线程。
https://serverfault.com/questions/1068281/asp-net-iis-requests-not-timing-out-after-executiontimeout-value/1128469