java - 从 Matlab 内部调用 JAX-WS Web 服务

标签 java matlab http-headers jax-ws

我有一个Vanguard我可以使用自定义 java 类调用(使用基本身份验证)的 Web 服务。 java wsimport 工具用于生成 java 代理 stub ,这一切都运行良好。

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 函数(包含上述代码)时,Web 服务调用失败并出现一个模糊错误:

??? 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,"<my webservice url>"]
        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.<init>(WSServiceDelegate.java:217)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:165)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:93)
at javax.xml.ws.Service.<init>(Service.java:56)
at edu.soton.decode.activities.vanguardws.MyWSObject.<init>(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
...

-> 除了上面显示的异常(exception)之外,一切都停止了。因此,当在 Matlab 中运行时,Matlab 似乎正在对 JVM 环境执行某些操作,阻止生成的代理进行第二次经过身份验证的调用。它只是在 401 之后退出,而不是像纯 java 情况那样进行身份验证。

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

最佳答案

事实证明,该问题似乎仅发生在非 L​​inux 平台上的 64 位版本的 Matlab 上。如果我安装 32 位版本的 Matlab,它就可以正常工作。我将把这个问题标记为已回答,因为这似乎是 Matlab 的问题,并且 Mathworks 正在调查该问题(线程 id:1-DUMQQZ])。

关于java - 从 Matlab 内部调用 JAX-WS Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4076564/

相关文章:

Java - MySQL - 创建连接错误

http - http-header "X-XSS-Protection"是什么?

http-headers - X-P2P-PeerDist header : where does it come from?

javascript - HTTP 缓存 header

java - 带 for 循环的 PrintWriter

java - Archos a28 : Read and Write directly to device 上的 USB 输入设备

image - 在 MATLAB 中为 8 位灰度图像着色

matlab - 如何手动计算 MATLAB linspace 函数

我可以用 C 语言创建 MATLAB 库吗?

java - 使用 Serializable 的副作用?