WSClient无法在https上连接交换wsdl

时间:2010-11-23 09:43:36

标签: ssl groovy wsdl webservice-client exchange-server

我试图将groovy WSClient连接到Exchange服务器wsdl,但不能因为我收到一个空文件(当我想解析wsdl时)。 我使用以下几行:

Map mapClient=[
                    "https.truststore":"/path/jssecacerts",
                    "https.truststore.pass":"changeit",
                    "https.keystore":"/path/cacerts",
                    "https.keystore.pass":"changeit"
    ]

    def proxy=new WSClient("https://mail.exchangeserver:443/ews/services.wsdl", this.class.classLoader)
    proxy.setSSLProperties(mapClient)
    proxy.setBasicAuthentication("user","password")
    proxy.initialize()

它基本上在proxy.initialize()失败,因为空文件上的xml解析错误。 但是,当我使用浏览器时,我有完整的wsdl文件。

这不是SSL握手,因为我已经奋斗了好几个小时才能让它运转起来。这是我得到的第一个错误......

我认为这是BasicAuthentication由于某种原因是错误的。我这样说的原因是:我可以注释掉认证线,我也有相同的结果。

任何提示?

1 个答案:

答案 0 :(得分:2)

好的,从另一个论坛,我得到了答案。 这是apache CXF(groovy WSClient的后端)的已知限制,它仅在使用webservice时使用凭证,而不是在获取wsdl时! 解决方法是在本地加载wsdl并使用以下命令构建WSClient:

new WSClient(this.class.classLoader.getResource("services.wsdl").toExternalForm(), 
             this.class.classLoader)

对于那些使用Exchange webservice的人来说,还没有完成!您还需要修复一些错误:

  • 下载messages.xsd和types.xsd以及services.wsdl
  • 修复types.xsd替换行

    <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
    

通过

 <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

最后修复了services.wsdl,添加了一个wsdl:service标签

  <wsdl:service name="ExchangeWebService">
     <wsdl:port name="ExchangeWebPort" binding="tns:ExchangeServiceBinding">
         <soap:address location="https://myserver/EWS/exchange.asmx" />
     </wsdl:port>
  </wsdl:service>

就是这样,它现在应该正确初始化!