我正在使用SOAP和JAXWS将.NET Web服务替换为Java CXF Web服务。 客户端是固定的,信不信由你,黑盒。 我正在尝试让服务使用 Java 服务和原始 .NET 客户端以相同的方式工作。 我尝试了许多方法,并确认对客户端的响应与 .NET 服务相同(字节(。 我尝试从 Java 服务返回 Windows 响应无济于事,这意味着我遇到了与传输相关的问题,可能是编码。 我注意到响应传输编码=[分块] - 我怀疑这可能是一个问题。我还没有找到在服务器上更改此设置的方法...但由于我无法修改客户端,因此需要解决方法。 我不熟悉 .NET API,但这是我收到的消息:
顺便说一句 - 来自客户端的错误[6] ERROR - [sweeper].[SweeperService.CollectSettingsInformation] <11501> (9990) There is an error in XML document (1, 2). at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
at client.ReadMessageEnvelope(String xml)
at client.Translate(String xml)
at client.CollectSettingsInformation()
任何想法将不胜感激。
改编自其他几个类似的解决方案:
public void handleMessage(Message message) {
boolean isOutbound = false;
isOutbound = message == message.getExchange().getOutMessage() || message == message.getExchange().getOutFaultMessage();
if (isOutbound) {
OutputStream os = message.getContent(OutputStream.class);
CachedOutputStream cs = new CachedOutputStream();
message.setContent(OutputStream.class, cs);
message.getInterceptorChain().doIntercept(message);
try {
cs.flush();
IOUtils.closeQuietly(cs);
CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
String currentEnvelopeMessage = IOUtils.toString(csnew.getInputStream(), "UTF-8");
csnew.flush();
IOUtils.closeQuietly(csnew);
int bytes = Math.toIntExact(currentEnvelopeMessage.getBytes().length);
HttpServletResponse response = (HttpServletResponse) message.get(AbstractHTTPDestination.HTTP_RESPONSE);
if(null != response){
log.debug("Setting Content Length: " + bytes);
response.setContentLength(bytes);
}
InputStream replaceInStream = IOUtils.toInputStream(currentEnvelopeMessage, "UTF-8");
os.flush();
if (os instanceof CopyingOutputStream)
((CopyingOutputStream)os).copyFrom( replaceInStream );
else
IOUtils.copy(replaceInStream, os);
replaceInStream.close();
IOUtils.closeQuietly(replaceInStream);
message.setContent(OutputStream.class, os);
IOUtils.closeQuietly(os);
} catch (IOException ioe) {
log.warn("Unable to perform change.", ioe);
throw new RuntimeException(ioe);
}
}
}