【问题标题】:WCF + "The underlying connection was closed: The connection was closed unexpectedly." [closed]WCF +“基础连接已关闭:连接意外关闭。” [关闭]
【发布时间】:2012-11-27 15:57:30
【问题描述】:

学习并获得一个有效的 WCF 来传输“网络爬行”数据是一场噩梦。

首先,GoDaddy 的服务器创建了一个不可追踪的错误,在第一次连接/调用后每隔 15 秒关闭我的 WCF 连接,无论我是否在每次调用后关闭连接。几周后,当我最终联系 GoDaddy 寻求解决方案时,我用尽了所有可能的解决方案。服务器迁移后,这个问题就消失了。

在 15 秒的连接中断中拔掉头发几周后,我遇到了另一个不可追踪的错误……“底层连接已关闭:连接意外关闭。”。至此,我差不多要放弃WCF,回到ASMX服务了。

错误:“底层连接已关闭:连接意外关闭。” 非常通用,解决方案各不相同,因此难以诊断/修复。跟踪日志不显示 jack 并且由于某种原因,我的本地计算机上不会发生相同的错误,只会在服务器上发生。当我收到此错误时,服务器跟踪日志甚至不会显示客户端调用。就像从未从客户端调用 WCF 服务一样......最重要的是,客户端的跟踪日志除了 "System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)" 之外没有显示任何内容 错误,没有帮助。

我在网上尝试了所有可能的解决方案或可能的方法来提供更有意义的跟踪,但没有运气。如果没有帮助的 Trace 日志,其他人会遇到这种情况吗?

【问题讨论】:

  • 嗨,吉姆,欢迎来到 Stack Overflow。不幸的是,这不是问题。它是对问题及其解决方式的描述,不是我们的标准问答格式。您可以将此作为正确的问题重新发布,并将解决方案作为答案,只需确保 question 遵循 FAQ 准则即可。
  • 不幸的是,我不能,因为答案已被版主删除。您可以标记以引起版主注意并解释发生了什么。

标签: xml wcf escaping wcf-client connection-close


【解决方案1】:

tl;博士: 如果您在 WCF 中遇到此错误,我想了解的主要内容是在出错时尝试 Intelli-Sense 类型调试窗口中的放大镜图标/查看为 XML。错误可能会像我一样暴露出来。


起初我以为是类数组的序列化在它上线之前就搞砸了。该数组返回了大量的对象,有些是嵌套的,所以这是很有可能的。我使用 Xml.Serializer 测试了这个理论到Serialize and Deserialize the returned Class Array into a XML document。这工作正常,客户端没有抛出错误。规则序列化出来。

然后我想,也许我的 web.Config 文件中的设置之一没有正确设置。不,一切都通过正确的绑定、行为、限制、超时......一切看起来都很好。所以我想,也许因为我要进行多次调用,所以这是一个并发或线程问题。为了测试这一点,我每个请求只返回一组结果,而不是序列化类对象的数组。我又遇到了错误!所以这不是并发或线程问题。

但是,返回单个类对象导致了解决方案。我注意到一个对象每次都失败......但是这个类对象是几个字符串、整数和列表(另一个类)的容器。返回的主类中的子对象通常不超过 1000 个。然而,很明显,在这个对象中返回的东西存在问题。在不知道要寻找什么的情况下遍历所有可能性(通常在 500-1000 之间) 有点像大海捞针。

幸运的是,当错误弹出给我“底层连接已关闭:连接意外关闭。”我将鼠标悬停在发送到 WCF 的 List(Of Class) 上在仍然显示错误的情况下进行服务。这带来了一个智能感知类型的调试窗口,可让您筛选列表(类)中的每个类,同时深入到类中的每个子对象。因为我只在我的 List(of class) 中返回了 1 个类,以帮助缩小范围,并假设不是 Integer 字段导致了问题 - 我直接返回了 String 变量。将它们复制并粘贴到记事本中,并没有真正看到我立即注意到的任何错误,尽管一些子对象引起了怀疑。然后出于好奇,我注意到这个智能感知类型调试窗口内的每个返回字符串旁边都有一个带有下拉箭头的小放大镜。对于我的每一个怀疑,我都点击放大镜,并注意到一个以 XML 格式查看字符串的选项。我点击了这个,然后很长一段时间,我在其中一个有意义的字符串上出错了!该错误指出了与某些文本混合的未转义符号。我没有意识到这是一个禁忌,所以我转义了以下 5 个字符 &、、"、'。我再次尝试并得到一个新错误,"只允许一个*元素XML 文档。错误处理资源”!@!

在做了一些研究之后,这个物体似乎仍然有些古怪。所以我尝试将可能的问题字符串包装在 "<![CDATA[""]]>" 中。得到相同的“XML 文档中只允许一个*元素。错误处理资源”错误!原来有一些 CSS 以 {color:#000000;} 的格式从裂缝中溜走。由于某种原因,括号引起了问题。我假设原因是因为 CSS 的格式看起来很像 JSON,而客户端是这样看的。删除括号/CSS 后,“XML 文档中只允许一个*元素。错误处理资源”消失,对象成功转移。

对于冗长的描述性答案感到抱歉,但我没有看到其他人遇到这些问题,没有提供有用的跟踪信息。希望这对其他人有帮助! (我在这里发帖回答我自己的问题,因为虽然这是一个简单的解决方案,但解决起来非常令人沮丧。)

【讨论】: