gpt4 book ai didi

web-services - 使用 Apache CXF 生成的类访问 Web 服务时出现 WebServiceException

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:06 25 4
gpt4 key购买 nike

我在使用 Apache CXF 生成的类 (wsdl2java) 访问 Web 服务时遇到问题。

一切正常,直到网络服务提供商突然更改了他们防火墙上的规则并关闭了我们。他们说的是他们不再允许 http 流量,我们必须开始使用 https。有趣的是,直到现在我们还认为我们使用的是 https。这是继承的遗留代码。但我们几乎是逐字逐句地使用 Apache CXF 网站上的 ssl 示例。

这是 wsdl 的一部分:

...
<wsdl:portType name="GetMessagesSoap">
<wsdl:operation name="GetInfo">
<wsdl:input message="tns:GetInfoSoapIn" />
<wsdl:output message="tns:GetInfoSoapOut" />
</wsdl:operation>
</wsdl:portType>

...

<wsdl:service name="GetMessages">
<wsdl:port name="GetMessagesSoap" binding="tns:GetMessagesSoap">
<soap:address location="http://127.0.0.1/GetMessages.asmx" />
</wsdl:port>
</wsdl:service>

基本上我们使用 wsdl2java 生成所有 Java 类。然后在我们的网关类中,我们执行以下操作:

private GetMessagesSoap getInstance() {
GetMessages getMessages = new GetMessages(wsdlUrl);
GetMessagesSoap getMessagesSoap = getMessages.getMessagesSoap();
setupTransportLayerSecurity(getMessagesSoap);
}

private void setupTransportLayerSecurity(final Object port) {

HTTPConduit httpConduit =
(HTTPConduit) ClientProxy.getClient(port).getConduit();
TLSClientParameters tlsCP = new TLSClientParameters();

KeyStore keyStore = ...
KeyManager[] myKeyManagers = getKeyManagers(keyStore ...
tlsCP.setKeyManagers(myKeyManagers);
KeyStore trustStore = ...
TrustManager[] myTrustStoreKeyManagers = getTrustManagers(trustStore);
tlsCP.setTrustManagers(myTrustStoreKeyManagers);
tlsCP.setDisableCNCheck(true);
tlsCP.setSecureSocketProtocol("SSL");

httpConduit.setTlsClientParameters(tlsCP);
}

然后我们调用 getInfo()。这就是错误发生的地方。

public void getInfo() {
GetMessagesSoap getMessagesSoap = getInstance();
InfoResponse response = getMessagesSoap.getInfo()
}

我们得到的错误是相当普遍的:

  javax.xml.ws.WebServiceException: Could not send Message.

ws 提供者说它失败了,因为我们正在尝试使用 http 进入。尽管我们在 setupTransportLayerSecurity() 方法中做了所有花哨的 SSL 事情,但所有这一切。

我对这一切的根本怀疑是,这真的是它失败的原因吗?我的意思是,当规则从防火墙中删除时,它显然开始失败。但是,我不明白的是,如果 wsdl 中的 GetMessages 服务中的 url 是 http,即使我说使用 SSL,它到底怎么会使用 https?

我们在网络上放置了一个嗅探器,果然它只使用了 http。但是……这不是很正常吗??显然,我绝不是 SOAP 专家。有人可以阐明这个问题吗?

最佳答案

本地址 url 以 https 开头时,CXF HttpConduit 仅使用 TlsClientParameters。您可以更改 WSDL 文件吗?如果没有,你可以change service url at the runtime .

关于web-services - 使用 Apache CXF 生成的类访问 Web 服务时出现 WebServiceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com