查看单个帖子
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 从Matlab内部调用JAX-WS Web服务

我有一个Vanguard Web服务,可以使用自定义Java类调用(使用基本身份验证)。 Java wsimport工具用于生成Java代理存根,并且所有这些都可以完美运行。

Java代码(以下所有类均由wsimport生成,并提供url +身份验证信息):

Authenticator.setDefault(new SimpleAuth(username,pass)); MyWSObject obj = new MyWSObject(url); -> triggers the exception ServicePortType port = obj.getServicePort(); OutputType result = port.MyWSMethod(params); OutputData data = result.getOutputData(); 当我从matlab运行完全相同的java函数(包含上面的代码)时,webservice调用失败,并出现模糊错误:

??? Java exception occurred: com.sun.xml.internal.ws.streaming.XMLStreamReaderException: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '"' (code 34) in DOCTYPE declaration; expected a space between public and system identifiers at [row,col,system-id]: [1,63,""] at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:256) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:84) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:99) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:89) at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.hasWSDLDefinitions(RuntimeWSDLParser.java:209) at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:119) at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:254) at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:217) at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:165) at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:93) at javax.xml.ws.Service.(Service.java:56) at edu.soton.decode.activities.vanguardws.MyWSObject.(MyWSObject.java:42) at edu.soton.decode.activities.VanguardActivity.execute(VanguardActivity.java:80) 如果在两种情况下都使用wireshark监视请求/响应,则会看到:

==直接调用Java函数==

以下所有调用/响应都是由wsimport生成的JAX-WS代码自动发生的。我的代码只是在生成的服务代理上调用webservice方法,没有什么花哨的地方。

GET /bin/ws.dsb?wsdl/mywebservice HTTP/1.1 User-Agent: Java/1.6.0_22 Host: myhost Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive ... HTTP/1.1 401 Authorization Required Server: Vanguard Server/5.1.10 Connection: close Content-Length: 608 Date: Mon, 01 Nov 2010 15:04:17 GMT Last-Modified: Mon, 01 Nov 2010 15:04:17 GMT Expires: Mon, 01 Nov 2010 15:04:17 GMT Cache-Control: no-cache WWW-Authenticate: Basic realm="Local Library" Auto-Studio-Login: 0 Content-Type: text/html ... GET /bin/ws.dsb?wsdl/mywebservice HTTP/1.1 User-Agent: Java/1.6.0_22 Host: myhost Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Authorization: Basic Z29yaXNzZW46ZGlyaw== ... HTTP/1.1 200 OK Server: Vanguard Server/5.1.10 Connection: close Content-Length: 5408 Date: Mon, 01 Nov 2010 15:04:17 GMT Last-Modified: Mon, 01 Nov 2010 15:04:17 GMT Expires: Mon, 01 Nov 2010 15:04:17 GMT Cache-Control: no-cache Set-Cookie: KillIDws=lpvovmb3oa9; path=/ Content-Type:text/xml ... POST /bin/ws.dsb?soap/mywebservice HTTP/1.1 Content-type: text/xml;charset="utf-8" Soapaction: "" Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 User-Agent: JAX-WS RI 2.1.6 in JDK 6 Host: myhost Connection: keep-alive Authorization: Basic Z29yaXNzZW46ZGlyaw== Content-Length: 214 ... HTTP/1.1 200 OK Server: Vanguard Server/5.1.10 Connection: close Content-Length: 851 Date: Mon, 01 Nov 2010 15:04:18 GMT Last-Modified: Mon, 01 Nov 2010 15:04:18 GMT Expires: Mon, 01 Nov 2010 15:04:18 GMT Cache-Control: no-cache Set-Cookie: KillIDws=lpvovmb3oi2; path=/ Content-Type:text/xml; charset=utf-8 ... ->最后一个响应是返回结果的位置

==与从Matlab内部调用的Java函数完全相同==

GET /bin/ws.dsb?wsdl/mywebservice HTTP/1.1 Accept: */* Accept-Encoding: gzip Accept-Language: en User-Agent: Mozilla/5.0 (Java 1.6.0_22; Windows XP 5.2 amd64; en_GB) ICEbrowser/v6_0_2 Host: myhost Connection: Keep-Alive ... HTTP/1.1 401 Authorization Required Server: Vanguard Server/5.1.10 Connection: close Content-Length: 608 Date: Mon, 01 Nov 2010 15:02:42 GMT Last-Modified: Mon, 01 Nov 2010 15:02:42 GMT Expires: Mon, 01 Nov 2010 15:02:42 GMT Cache-Control: no-cache WWW-Authenticate: Basic realm="Local Library" Auto-Studio-Login: 0 Content-Type: text/html ... ->除了上面显示的异常,一切都在这里停止。因此,当在Matlab中运行时,Matlab似乎正在对JVM环境进行某些操作,从而阻止了生成的代理进行第二次身份验证的调用。它只是在401之后解脱,而不是像纯Java情况那样进行身份验证。

我已经设置了MATLAB_JAVA环境变量,以便在两种情况下都使用相同的JVM(Sun 1.6)。我还注意到,Matlab在发送请求时不尊重http.agent属性。



回答:

事实证明,该问题似乎只发生在非Linux平台上的64位版本的Matlab上。如果我安装32位版本的Matlab,效果很好。我将这个问题标记为已回答,因为这似乎是Matlab的问题,Mathworks正在调查该问题(线程ID:1-DUMQQZ])。



更多&回答...
poster 当前离线   回复时引用此帖