-1

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

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

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

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

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

4

1 回答 1

3

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


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

然后我想,也许我的 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 文档中只允许一个顶级元素。错误处理资源”消失,对象成功传输。

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

于 2012-11-27T15:57:30.127 回答