java - 使用 Metro 客户端缓冲传入的 SOAP 消息时出错

标签 java wcf web-services webservice-client java-metro-framework

我正在使用 Metro 2客户端使用“Java 中的安全 wcf web 服务”。但是 Metro 客户端没有给出任何响应并在很长时间后一直处于挂起模式,它产生错误输出:

堆栈跟踪:

SEVERE: WSSMSG0001: Error occurred while buffering incoming SOAP message.
com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x1a
 at [row,col {unknown-source}]: [1,6396222]
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2442)
    at com.ctc.wstx.sr.StreamScanner.validateChar(StreamScanner.java:2389)
    at com.ctc.wstx.sr.StreamScanner.resolveCharEnt(StreamScanner.java:2355)
    at com.ctc.wstx.sr.StreamScanner.fullyResolveEntity(StreamScanner.java:1501)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2726)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1065)
    at com.sun.xml.ws.util.xml.XMLStreamReaderToXMLStreamWriter.bridge(XMLStreamReaderToXMLStreamWriter.java:142)
    at com.sun.xml.ws.message.stream.StreamMessage.writePayloadTo(StreamMessage.java:376)
    at com.sun.xml.ws.message.stream.StreamMessage.writeEnvelope(StreamMessage.java:412)
    at com.sun.xml.ws.message.stream.StreamMessage.writeTo(StreamMessage.java:390)
    at com.sun.xml.ws.security.message.stream.LazyStreamBasedMessage.readMessage(LazyStreamBasedMessage.java:476)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.verifyInboundMessage(SecurityTubeBase.java:444)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientResponsePacket(SecurityClientTube.java:434)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processResponse(SecurityClientTube.java:362)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:972)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775)
    at com.sun.xml.ws.client.Stub.process(Stub.java:429)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
    at $Proxy44.pullCustomers(Unknown Source)
    at com.tekriti.client.Client.test(Client.java:106)
    at com.tekriti.client.Client.main(Client.java:44)
com.sun.xml.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: Internal XSB error: Invalid State=0]
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:141)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
    at $Proxy44.pullCustomers(Unknown Source)
    at com.tekriti.client.Client.test(Client.java:106)
    at com.tekriti.client.Client.main(Client.java:44)
Caused by: javax.xml.bind.UnmarshalException

我正在尝试解决此问题,但没有成功,Metro 客户端无法以正确的方式解析 SOAP 响应。我不知道我在哪里做错了,或者我必须使用其他东西。
我正在使用 Netbeans 7.1Metro 2.2

请提供您的建议,如果您过去遇到过此类问题,请与我分享。

更新:

这工作正常:

     Dispatch<Source> sourceDispatch = null;
     sourceDispatch = service.createDispatch(portQName, Source.class, Service.Mode.MESSAGE);

     ((BindingProvider)sourceDispatch).getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "http://cdx.dealerbuilt.com/Api/0.97/IStandardApi/PullCustomers");
    ((BindingProvider)sourceDispatch).getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
   Source result = sourceDispatch.invoke(new StreamSource(new StringReader(req)));

req 包含以下内容:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <Action>http://cdx.dealerbuilt.com/Api/0.97/IStandardApi/PullCustomers</Action>
    </s:Header>
    <s:Body>
        <PullCustomers xmlns="http://cdx.dealerbuilt.com/Api/0.97/">
            <searchCriteria xmlns:d4p1="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <d4p1:ActivityStoreIds xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                    <d5p1:long>64</d5p1:long> 
                </d4p1:ActivityStoreIds>

                <d4p1:EnvironmentIds xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
                    <d5p1:long>27</d5p1:long>      
                </d4p1:EnvironmentIds>
            </searchCriteria>
        </PullCustomers>
    </s:Body>
</s:Envelope>

但它在输出中生成 Source 并在请求中采用 SOAP 信封。

我需要这应该可以工作。

   org.tempuri.StandardApi service = new org.tempuri.StandardApi();
   CustomerSearchCriteriaType criteriaType = new CustomerSearchCriteriaType();

   QName environmentQName = new QName("http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi", "EnvironmentIds");
   ArrayOflong arrayOflong = new ArrayOflong();
   arrayOflong.getLong().add(27l);
   JAXBElement<ArrayOflong> environmentIds = new JAXBElement<ArrayOflong>(environmentQName, ArrayOflong.class, arrayOflong);
   criteriaType.setEnvironmentIds(environmentIds);

   QName activityQName = new QName("http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi", "ActivityStoreIds");
   ArrayOflong arrayOfActivity = new ArrayOflong();
   arrayOfActivity.getLong().add(64l);
   JAXBElement<ArrayOflong> activityIds = new JAXBElement<ArrayOflong>(activityQName, ArrayOflong.class, arrayOfActivity);
   criteriaType.setActivityStoreIds(activityIds);

   ArrayOfCustomerType customers = service.getCustomBindingIStandardApi().pullCustomers(criteriaType);
   if (customers != null) {
       System.out.println("Size of Customers::::" + customers.getCustomer().size());
   }

请求包含

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <PullCustomers xmlns="http://cdx.dealerbuilt.com/Api/0.97/">
            <searchCriteria>
                <ActivityStoreIds xmlns="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi">
                    <long xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">64</long>
                </ActivityStoreIds>
                <EnvironmentIds xmlns="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi">
                    <long xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">27</long>
                </EnvironmentIds>
            </searchCriteria>
        </PullCustomers>
    </soapenv:Body>
</soapenv:Envelope>

但它在产生输出时挂起,并且在很长时间后产生上述错误。

是请求之间的差异导致了问题还是其他原因?

最佳答案

我认为网络服务返回给客户端的数据包含非法字符0x1a,即EOF
XML 不允许在其中使用 CONTROL CHAR。由于您正在使用 SOAP,因此最终是 XML。

查看类似问题:illegal character in xml document

解决方案:
1.要么你可以消除CONTROL char
2. 或者在 web-service 中对其进行编码,然后在 SOAP 客户端对其进行解码。

关于java - 使用 Metro 客户端缓冲传入的 SOAP 消息时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9973581/

相关文章:

wcf - 在 Web 场环境中使用共享缓存来检测 WCF 中的重放攻击

.net - 在 IIS Express 中托管 WCF 服务时出现问题

c# - 如何在 IClientMessageInspector 中获取调用的操作名称?

php - 如何在线程中组织图像?

java - 如何通过 RestAssured 重用常见断言

java - 使用 Java Oracle 7 运行 cassandra 1.1.9 时出现问题

java - 谷歌地图 Android 中的中心 GeoJson

java - Java 中的线程和计算

java - 从 CXF 服务实现中添加 HTTP header

java - 如何使用临时 Web 服务(非 SOAP、无模式 XML)?