【问题标题】:ASP.Net connection keep alive for long running server-side taskASP.Net 连接为长时间运行的服务器端任务保持活动状态
【发布时间】:2026-01-18 07:55:02
【问题描述】:

我有一个在 IIS 上运行的 ASP.Net C# Web 应用程序,我支持它涉及到 Word 文档的生成。其中一些 word 文档需要很长时间(即超过 20-30 分钟)才能生成。在我的开发服务器上进行测试时,我注意到服务器在进程完成之前很久就关闭了连接,服务器端 ASP.Net 代码本身进入一个循环并在单词 doc 生成完成时更新布尔值的状态。

我的解决方法是通过在客户端上实现一个动态动画等待屏幕(使用 jquery 和 ajax)来保持连接活跃,该屏幕由对服务器的重复异步 AJAX 调用更新,以检查操作的状态来自服务器端的 Web 方法。我在另一个question 中询问关于那篇文章。

我正在寻找的解决方案是解决这个问题的最佳方法吗?在长时间运行的服务器端操作期间,是否有更有效或更常用的方法来保持连接处于活动状态?感谢您提供任何帮助或见解,谢谢。

更新:

我尝试了 Brian 的建议,不幸的是我仍然从 Chrome 收到相同的错误,即没有从服务器发送数据,整个错误如下:

未收到数据无法加载网页,因为服务器未发送 数据。

以下是一些建议:稍后重新加载此网页。

错误 324 (net::ERR_EMPTY_RESPONSE):服务器关闭了连接 不发送任何数据。

我将按照所述在高级网站设置中设置连接超时并增加连接空闲设置,然后再试一次。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    理想情况下,您会使用套接字在进程完成时通知客户端。查看 socket.io 或本机 web-socket 实现以了解如何执行此操作。

    【讨论】:

    • 嗨,Esteban,这听起来像是我的加载屏幕的潜在替代品,但它还没有像预期的那样工作。在我的 ASP.Net webform 应用程序回发期间是否可以集成套接字连接。然后将该管道状态信息返回到客户端浏览器?我只是好奇浏览器将如何处理从套接字连接发送的数据,而不是接收来自服务器的直接响应。
    • SignalR 在封装 web-sockets(和备用替代方案)方面做得很好。这种方式而不是客户端轮询服务器(如在您已经提到的实现中),客户端维护与服务器的连接,该连接在任务完成时向客户端发出回调。 github.com/SignalR/SignalR
    【解决方案2】:

    您可以在 IIS 7 中控制空闲时间。这是通过转到 IIS 管理来完成的;选择应用程序池;然后右键单击您用于网站的池。单击此处的“高级设置”,您将能够控制空闲时间和您网站的一些其他设置。希望这就是您想要的。

    【讨论】:

    • 嗨布莱恩,我现在正在测试这个解决方案,最初我尝试在我的默认网站的高级设置中配置连接超时值,但这似乎没有影响,Chrome,对于例如,抛出“错误 324 (net::ERR_EMPTY_RESPONSE):服务器关闭连接但未发送任何数据。”。 IE 只会闲置并最终抛出“无法显示网页”错误。
    • 从您发布的错误消息来看,您尝试访问的网站似乎没有运行。我会检查 IIS 中的应用程序池和网站,看看它们是否正在播放。我会重新启动或刷新它们以防万一。此外,检查您的 web.config 以查看是否有任何超时。其他对我有帮助的方法是使用 firebug 插件运行 Firefox。这将有助于发现任何错误。
    最近更新 更多