Вызов веб-сервиса JAX-WS из Matlab - PullRequest
1 голос
/ 02 ноября 2010

У меня есть веб-служба Vanguard , которую я могу вызвать (используя обычную аутентификацию), используя пользовательский класс 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();

Когда я запускаю точно такую ​​же Java-функцию (содержащую приведенный выше код) из matlab, вызов веб-службы завершается неудачно с непонятной ошибкой:

??? 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, вызываемая напрямую ==

Все приведенные ниже вызовы / ответы выполняются автоматически с помощью кода JAX-WS, сгенерированного wsimport.Мой код просто вызывает метод веб-сервиса на сгенерированном прокси-сервере сервиса, ничего особенного.

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
...

-> последний ответ - это результат возврата

== Точно так жеJava-функция вызывается из Matlab ==

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 при отправке запросов.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

Оказывается, что проблема возникает только в 64-битных версиях Matlab на платформах, отличных от Linux.Это работает нормально, если я устанавливаю 32-битную версию Matlab.Я собираюсь пометить этот вопрос как ответивший, так как это похоже на проблему с Matlab, и Mathworks исследует эту проблему (ID потока: 1-DUMQQZ]).

0 голосов
/ 11 ноября 2010

ICEbrowser, который MATLAB все еще использует на некоторых платформах для рендеринга HTML, вставляет некоторые свои собственные классы в глобальные настройки виртуальных машин.Это может работать для вас, если вы никогда не откроете браузер справки в текущем сеансе.

0 голосов
/ 04 ноября 2010

Если за настройку отвечают параметры прокси-сервера, для настройки можно использовать следующие статические методы.

% configure
java.lang.System.getProperties().put('http.proxyHost', 'your.proxy');
java.lang.System.getProperties().put('http.proxyPort', 'port number');
java.lang.System.getProperties().put('http.proxyUser', 'name');
java.lang.System.getProperties().put('http.proxyPassword', 'password');

java.lang.System.getProperties().put('http.proxySet', 'true');

% verify
java.lang.System.getProperty('http.proxyHost')
java.lang.System.getProperty('http.proxyPort')
java.lang.System.getProperty('http.proxyUser')
java.lang.System.getProperty('http.proxyPassword')

% test
urlread('http://www.yahoo.com/')
...