0

我在带有 Metro {2.2.1-1} Web 服务堆栈的 Java 客户端程序和 Windows XP SP3 上的 WCF {.NET 4.0 v30319} wsHttpBinding Web 服务之间有一个正在运行的 Web 服务连接。

如果我将完全相同的设置移动到 Windows 7 {带有一些企业设置}或 Windows 2008 R2 Server SP1 {来自 MS DVD},我会收到从 Java 客户端到 WCF 服务的挂起请求。即两个合作伙伴之间没有任何数据交换的症状{我在客户端有 -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 在服务器端有诊断打印消息 -都没有输出}。从网络上讲,TCP 连接处于打开状态(“netstat -a”),直到 200+-5 秒后发生超时,堆栈跟踪如下:

Jul 19, 2013 12:13:00 PM ch.xxxxxxxx.xxxxx.balance.client.start.Start main
SEVERE: null
com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: com.ctc.wstx.exc.WstxIOException: Connection reset
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:326)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:99)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:169)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:104)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseBinding(RuntimeWSDLParser.java:584)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseWSDL(RuntimeWSDLParser.java:470)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseImport(RuntimeWSDLParser.java:427)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseImport(RuntimeWSDLParser.java:835)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseWSDL(RuntimeWSDLParser.java:464)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:232)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:192)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:161)
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:328)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:290)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:217)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:199)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:195)
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:112)
    at javax.xml.ws.Service.<init>(Unknown Source)
    at ch.xxxxxxxx.xxxxx.balance.client.SystemIntegrationServiceBridge.<init>(SystemIntegrationServiceBridge.java:50)
    at ch.xxxxxxxx.xxxxx.balance.client.start.Start.main(Start.java:37)
Caused by: com.ctc.wstx.exc.WstxIOException: Connection reset
    at com.ctc.wstx.sr.StreamScanner.constructFromIOE(StreamScanner.java:625)
    at com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.java:1049)
    at com.ctc.wstx.sr.StreamScanner.parseLocalName2(StreamScanner.java:1857)
    at com.ctc.wstx.sr.StreamScanner.parseLocalName(StreamScanner.java:1817)
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2925)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2817)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1065)
    at com.sun.xml.ws.util.xml.XMLStreamReaderFilter.next(XMLStreamReaderFilter.java:96)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:80)
    ... 19 more
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.net.www.MeteredStream.read(Unknown Source)
    at java.io.FilterInputStream.read(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
    at com.ctc.wstx.io.BaseReader.readBytes(BaseReader.java:155)
    at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:368)
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:111)
    at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:87)
    at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:57)
    at com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.java:1046)
    ... 26 more

如果我在此期间终止服务,客户端会立即停止等待并显示类似的堆栈跟踪,并且正如预期的那样,不再存在 TCP 连接。
激活 WCF 日志记录(参见http://msdn.microsoft.com/en-us/library/ms730064.aspx)显示了一个日志,WCF 认为,它已经交付了 WSDL 的三个部分(/?wsdl,/? wsdl=wsdl0, /?wsdl=wsdl1) 完全成功。
一切都以管理员身份运行,UAC 已关闭,没关系,我是否关闭或打开了防火墙,或者我是否关闭或打开了 IPv6。我试过 JRE 7_u17 32bit、7_u25 32bit 和 7_u25 64bit。

SoapUI 4.5.1 在win7-oid平台上与本地服务完美通信。
WCF 客户端在本地与服务通信,无需代理。
使用 Metro 库的小型 Java Web 服务客户端在本地调用相应的 WCF Web 服务,工作正常。
如果我在 win7-oid 平台上安装 http 代理 Fiddler 并重新配置我的 Java 客户端应用程序以使用代理 {-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888 -Dhttp.nonProxyHosts=""},一切都很好。
如果客户端在 XP 机器上,而服务在 W7oid 上,则远程访问 WCF 服务可以正常工作,无需任何技巧。

想像力不足,这种奇怪行为的原因可能是什么,我想问以下问题:
- 有没有人遇到过类似的问题
- 任何提议,Windows 机制可能会以所描述的方式干扰
- 任何提议,我可以进行哪些其他实验以更接近解决方案
- 我应该采取哪些额外的诊断措施来将其归结为问题[和解决方案,我希望]

4

2 回答 2

0

上述症状表明,问题

  • 在检索 [部分] WSDL 期间出现
  • 在直接使用 W7oid 网络连接时发生。

这引发了对 TCP 级别发生的事情的进一步分析。首先,无法看到我与 Wireshark 1.10.2 的 Web 服务连接的任何本地 IP 流量。甚至通过物理 IP 接口的 IP 流量也不可见。此外,大多数其他至少以某种方式免费提供的网络分析器似乎不支持分析 W7 和 Windows 2008 Server 的环回接口上的 IP 流量。

最后,我能够通过 CommView 和 LocalNetworkMonitor 的试用版获得更多见解:

  • 配置为使用物理 IP 接口的 IP 流量也 [秘密地] 通过本地网络堆栈路由,就好像它是环回连接一样。
  • 这种类似环回的 IP 流量似乎在 W7oid 平台上的技术上不同的 IP 堆栈上工作。否则,工具将无法区分这两种情况。
  • 在 TCP 级别上,客户端首先打开一个 http-TCP 连接以检索“?wsdl”。(“?wsdl”包含对两个大型 wsdl 文件“?wsdl=wsdl0”和“?wsdl=wsdl1”的引用)然后,几乎同时,客户端在同一个 TCP 连接上请求“?wsdl=wsdl0”(可能是由于保持活动状态)和新打开的第二个 TCP 连接。然后,这两个连接之一是未读和未终止的。只有在大约 200 秒的超时之后,才会有一些额外的数据块开始传输,并且 TCP 连接都关闭(紧跟上面的客户端堆栈跟踪)。

结论:
至少对于 WCF 和 Metro 的标准设置 HTTP-keep-alive,W7 和 W2k8 服务器通过环回接口处理 HTTP-TCP 流量的方式以及 WCF 和 Metro 期望的方式,不适合一起。
在给定的范围内,不可能将其归结为真正的原因。但是,W7 环回网络堆栈似乎非常挑剔。即使是网络监控工具也存在严重问题,无法提供正确工作的解决方案。

解决方法...
...是将 Web 服务通道配置到物理 IP 接口,并在 W7/W2k8 盒子上设置高优先级 IP 路由,通过 IP 网关将流量引导到该接口。只有这样,W2k8 才能被迫避免环回,并通过其“通常”的 IP 堆栈真正将 IP 流量传递到物理网络接口——一切都在其上,即。网络服务和工具,工作正常。

于 2014-04-28T13:11:17.443 回答
-1

您确定所有连接都已正确关闭吗?当 .Close() 在先前的响应流中被遗忘时,您描述的症状经常出现在 .NET 世界中。

在以后的请求中,客户端在等待连接可用时最终阻塞(由于 HTTP 连接限制)。http://fiddler2.com/blog/blog/2013/02/28/help!-running-fiddler-fixes-my-app-

于 2013-07-25T03:18:45.940 回答