我在大约两周前在IIS 8.0中部署了一个.NET Web API应用程序。
有一个很长的待处理方法会异步处理大量事情,最多可能需要约20/30分钟(客户端可以关闭应用程序并收到包含结果的电子邮件或在屏幕上等待,直到过程结束)。
问题发生了,等待响应90秒后,呼叫挂起并重试再次执行相同的呼叫,例如:我尝试处理15个项目(将它们插入数据库),90秒后,进程挂起它又重新开始(插入另外15条记录),最终整个过程只是挂起而且永远不会完成。
在浏览和研究之后,我发现IIS的应用程序池ShutDownTimeLimit实际上是在杀死我的呼叫,因为它是空闲的,并且在默认时间内没有收到任何响应(这是90秒)。我增加了价值,这基本上解决了我的问题。
但是,我仍然不确定为什么我的控制器上的操作被重新触发,你们是否知道在检测到ShutDownTimeLimit之后IIS是否可能正在重新执行调用超过了?
任何帮助都将不胜感激。
PD:我的前端只是做了一次完全的呼叫,没有来自它的多个呼叫。
答案 0 :(得分:0)
即使已超出ShutDownTimeLimit,当关闭时间段足够长以允许此时,旧工作进程也会正常关闭(完成请求处理)。但是,当达到关闭时间限制时,如果有另一个请求,则可以启动新的工作进程。我不认为IIS会重试这个电话(我已经测试过了)。所以请确保没有来自前端或其他地方的其他电话。顺便说一句,在ApiController中开始基本上长时间运行的即发即弃任务并不是一个好主意,请进一步阅读this question。