2010-11-02 7 views
1

J'ai un service web Vanguard que je peux appeler (en utilisant l'authentification de base) en utilisant une classe Java personnalisée. L'outil java wsimport a été utilisé pour générer les stubs proxy java et tout cela fonctionne parfaitement.Appel d'un service Web JAX-WS depuis Matlab

Le code java (Toutes les classes ci-dessous sont générés par wsimport donné une url + info d'authentification):

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(); 

Quand je lance la même fonction java exacte (contenant le code ci-dessus) de Matlab l'appel webservice échoue avec une erreur obscure:

??? 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) 

Si je Wireshark pour surveiller les demandes/reponses dans les deux cas je vois:

== Fonction Java appelée directement ==

Tous les appels/réponses ci-dessous sont générés automatiquement par le code JAX-WS généré par wsimport. Mon code appelle simplement la méthode webservice sur le proxy de service généré, rien d'extraordinaire.

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

-> la dernière réponse où les résultats sont renvoyés

== Exactement la même fonction Java appelé à l'intérieur 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 
... 

-> tout s'arrête ici l'exception montrée ci-dessus. Ainsi, lors de l'exécution dans Matlab, il semble que Matlab fasse quelque chose à l'environnement JVM qui empêche le proxy généré de faire un second appel authentifié. Il s'écoule simplement après le 401 au lieu de s'authentifier comme dans le cas du Java pur.

J'ai défini la variable d'environnement MATLAB_JAVA afin que la même JVM (sun 1.6) soit utilisée dans les deux cas. J'ai également remarqué que Matlab ne respecte pas la propriété http.agent lors de l'envoi de requêtes.

+0

Pourriez-vous publier le code Java appelé à partir de MATLAB. – zellus

+0

Modifier: ajouté le code java + pleine exception – dgorissen

+0

Le * url * semble être correct sur la base de votre analyse wireshark. Y a-t-il une différence concernant les * params *? Vous pouvez spécifier un autre jvm en utilisant * MATLAB_JAVA *. – zellus

Répondre

2

Il s'avère que le problème semble se produire uniquement sur les versions 64 bits de Matlab sur les plates-formes non-linux. Cela fonctionne très bien si j'installe une version 32 bits de Matlab. Je vais répondre à cette question car cela semble être un problème avec Matlab et Mathworks étudie le problème (thread id: 1-DUMQQZ)).

+1

+1 pour les commentaires. – zellus

+1

Mise à jour: c'est un bug confirmé. Je cite: "Les seules solutions de contournement sont de démarrer MATLAB avec l'indicateur -nodisplay, c'est-à-dire démarrer MATLAB sans charger le bureau, ou (comme vous l'avez déjà souligné dans un précédent mail) utiliser MATLAB 32 bits sous Windows, ou MATLAB 64 bits sous Linux. " – dgorissen

0

Si les paramètres de proxy sont responsables du problème, les méthodes statiques suivantes peuvent être utilisées pour la configuration.

% 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/') 
+0

http.proxySet est un mythe urbain. Cela n'a aucun effet. – EJP

0

ICEbrowser, que MATLAB utilise toujours sur certaines plates-formes pour le rendu HTML, insère certaines de ses propres classes dans les paramètres de la machine virtuelle globale. Cela peut fonctionner pour vous si vous n'ouvrez jamais le navigateur d'aide dans la session en cours.

Questions connexes