复现“一个预期保持活动状态的连接被服务器关闭”。

10

我们在一个WinForms应用程序中使用WebClient,.NET 3.5sp1。对于一些用户,这会导致异常,并显示以下消息:

“底层连接已关闭:服务器关闭了预期保持活动状态的连接。”

在网络上搜索一下,建议“解决”方法就是禁用HTTP keepalive,但我们真的不想这么做,还有一些人认为这可能是.NET库中的错误等。

错误消息表明,这是一个keepaliv的HTTP连接,由于某些原因被服务器(或代理)关闭,而WebClient没有正确检测到它的底层情况。

我们考虑捕获这种特定情况,然后简单地重试请求。然而,我们无法复制此异常。所以:

  1. 如何正确捕获导致上述错误消息的情况。

    catch(WebException ex) { if (ex.Message == "The underlying connection was closed: A connection that was expected to be kept alive was closed by the server") { ... }

    感觉不太可靠。

  2. 您有关于如何复制上述异常的任何提示吗?


“对于一些用户”表明并非所有人。这些用户是否在代理后面(明确设置或透明代理)?在公司环境中繁忙的代理服务器可能会意外丢弃连接,因此引发异常。无论哪种方式,这都是某种类型的网络问题(客户端、主机或中间件),而不是.NET Framework中的错误。 - user111013
2
你可能是对的,这很可能是一个网络问题。因此,我们想尝试简单重试请求,如果出现特定情况,虽然我们知道的仅仅是来自 WebException 的文本 - 那么有没有可靠的方法来检测这个特定的异常,一些特定的错误代码或其他什么?而且我们想要复现它,这样我们就可以测试在出现“连接已关闭”时重试请求不会导致其他问题。 - Habalusa
当我尝试从服务层发送大量数据时,我遇到了相同的错误。有什么线索可以解释这种情况吗? - Arnab Chakraborty
2个回答

2

WebClient可以很好地检测到这个问题,因此出现了异常。您需要找到行为不当的服务器。如果找到该服务器,不太确定该怎么做,也许您可以发送一封友好的电子邮件给管理员。

记录服务器URL。


这可能是由于过载的NAT网关过早关闭连接,或者中间代理服务器出现问题,其中任何一个都不会有人找到解决方法。与此同时,用户将遭受痛苦。还存在明显的竞态条件 - 例如,如果服务器在客户端尝试在缓存的连接上发送新请求时正确发送了Connection-Close:但是连接关闭尚未收到。因此问题是 - 有没有什么好方法可以重现此异常,并且如何检查此特定情况,而不是比较e.Message? - Habalusa
1
只有在你的代码中可以做些事情来解决问题时,自定义异常处理才有用。你无法解决过载的路由器或者难以启动的服务器。而且操作系统也分辨不出区别。这属于WebExceptions的大类,你只能稍后再试。这就是为什么没有专门的异常类来处理这种故障。与IOException(“发生了一些麻烦”)与FileNotFoundException(“常见的麻烦,可能能够修复”)类似。 - Hans Passant

1

我建议您查看微软的this博客:Http客户端协议问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接