我在带有 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 机制可能会以所描述的方式干扰
- 任何提议,我可以进行哪些其他实验以更接近解决方案
- 我应该采取哪些额外的诊断措施来将其归结为问题[和解决方案,我希望]