5

我遇到的情况是 ASP.NET 需要很长时间才能通过网页生成回复(超过 2 小时)。这是由于代码隐藏运行了一段时间(很长,很慢的循环)。

浏览器(IE 和 Firefox)停止等待回复(大约一个小时后)并给出通用的无法显示网页错误(类似于您尝试导航到不存在的服务器时看到的内容)。

同时 asp.net 应用程序继续运行(我可以在调试器中看到它)并最终完成。

为什么会这样?web.config 中是否有任何设置可以影响这一点?我希望有一个我错过的超时设置导致了这种情况。

也许是 IE 或 Firefox 中的设置?但我认为他们在服务器保持连接时等待。

即使我在本地机器上从 VS 以调试模式(编译 debug="true")启动应用程序时,我也会遇到这种情况(因此它不是在 IIS 上运行,而是在 ASP.NET 开发服务器上运行)。

我知道生成页面需要这么长时间是不好的,但在这个阶段并不重要。加快速度将需要大量额外的工作,而延迟并不重要。这是内部使用的。

我意识到我可以围绕这个问题重新设计将逻辑运行到后台进程并在通过 AJAX 完成时收到通知,或者将其拉到桌面应用程序或服务或其他任何东西。最终会按照这些思路做一些事情,但这不是我现在要问的。

4

4 回答 4

6

听起来您正在使用 IE,并且在等待服务器响应时超时。

您可以找到一篇 technet 文章来调整此限制:

http://support.microsoft.com/kb/181050

原因

根据设计,Internet Explorer 对服务器返回数据施加了超时限制。4.0 和 4.01 版的超时限制为 5 分钟,5.x、6 和 7 版的超时限制为 60 分钟。因此,Internet Explorer 不会无休止地等待服务器返回数据时服务器已一个问题。回到顶部

解析度

一般来说,如果一个页面在几分钟内没有返回,许多用户会认为出现问题并停止该过程。因此,将您的服务器进程设计为在 5 分钟内返回数据,这样用户就不必等待很长时间。

于 2009-03-11T02:20:59.670 回答
4

Web 的整个范例是请求/响应。不请求,等待两个小时,响应!

如果工作需要很长时间才能完成,那么让页面请求触发工作,然后不要等待它。将长时间运行的代码放入 Windows 服务中,并让该服务侦听 MSMQ 队列(或将 WCF 与 MSMQ 端点一起使用)。让页面向此队列发送工作请求。该服务将读取一个请求,可能会启动一个新线程来处理它,然后将响应写入另一个队列、文件或其他任何东西。

同一页面或不同的“进度”页面可以轮询响应队列或文件以获取响应,并更新用户,假设用户在两小时后仍然关心。

于 2009-03-11T02:17:56.323 回答
3

对于需要这么长时间的事情,我会想办法通过 AJAX 启动它,然后定期检查它的状态。后台进程应该定期更新一些状态变量,并在完成时将其数据存储在缓存或会话中。当它完成并且浏览器检测到这一点(通过 AJAX)时,让浏览器进行真正的回发(或通过更改 location.href 获取),获取保存的数据并生成页面。

于 2009-03-11T02:17:31.567 回答
0

我有一个可能需要几分钟的过程,所以我分拆一个单独的线程并通过 ftp 发送结果。如果过程中发生错误,我会向自己发送一条错误消息,其中包括堆栈跟踪。您可能需要考虑通过电子邮件或其他地方而不是浏览器发送结果,并使用线程。

于 2009-05-08T14:25:28.437 回答