2011-09-27 1 views
0

J'essaie d'envoyer une pièce jointe au client à partir du service Web Axis2. Le problème est que le contexte de message, que le client reçoit du service, ne contient aucune pièce jointe, bien que le dernier semble l'ajouter. Voici le bref code des deux côtés. Service:Perdre des pièces jointes dans la réponse Axis2

MessageContext inMC = MessageContext.getCurrentMessageContext(); 
OperationContext operationContext = inMC.getOperationContext(); 
MessageContext outMC = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE); 
DataHandler handler = new DataHandler (new FileDataSource("C://goods.xml")); 
String attachID = outMC.addAttachment(handler); 
OMElement idElem = factory.createOMElement("doc", ns); 
idElem.addAttribute("href", "cid:" + attachID, ns); 

client (en essayant de recevoir la pièce jointe):

MessageContext mcResponse = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); 
SOAPBody body = mcResponse.getEnvelope().getBody(); 
OMElement attachElem = body.getFirstChildWithName (new QName("doc")); 
String attachID = attachElem.getAttributeValue (new QName("href")); 
attachID = attachID.replaceFirst("cid:", ""); 
DataHandler dataHandler = mcResponse.getAttachment(attachID); 

méthode Getattachment() retourne null. En cas de débogage de l'application cliente, IDE montre que cette carte de pièce jointe dans le contexte de message d'entrée ne contient aucun élément (taille = 0). L'objet OMElement (idElem), qui contient l'ID de pièce jointe, est reçu et lu par le client normalement (le débogage a montré cid). Les paramètres enableSwA, cacheAttachments, attachmentDIR, sizeThreshold sont définis à la fois dans services.xml et dans la partie programmation du client. Quel est le problème avec le contexte du message? Merci beaucoup pour vos suggestions.

Mise à jour: TCPmon a montré le contenu suivant. Demande au service:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><getXMLFile xmlns="http://axis2.apache.org"><filename>goods.xml</filename></getXMLFile></soapenv:Body></soapenv:Envelope> 

Je pense qu'il est ok :)

Réponse du service:

109 
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><doc href="cid:[email protected]"></doc></soapenv:Body></soapenv:Envelope> 
0 

Je présente mes excuses pour un peu des questions simples, mais où devrait se refléter l'attachement? Je suppose que si le service envoie une pièce jointe, le message SOAP contient des données binaires, n'est-ce pas? J'ai aussi vérifié que la pièce jointe était dans un contexte de message côté service - c'est OK, je peux l'obtenir du contexte après l'ajout.

+0

Avez-vous trace le trafic HTTP? – home

+0

Non, je ne l'ai pas fait.La supposition de l'ajout réussi de la pièce jointe sur la pièce de service est basée sur l'exécution normale de cette partie et la transmission de OMElement avec l'ID de pièce jointe au client. Si vous expliquez, comment tracer le trafic HTTP et ce que les résultats du traçage signifieront, je serai heureux de le faire :) – Eadel

+1

Vous pourriez par exemple. utilisez Wirkshark ou un simple proxy TCP pour voir si la pièce jointe a été soumise. Vous seriez en mesure d'isoler le problème au client ou au serveur. – home

Répondre

1

Le problème a été résolu. Le problème était du côté du service. TCPmon a montré qu'il n'y avait pas de pièces jointes dans le message responce. Cependant, le même example service fonctionne très bien. Après avoir vérifié et comparé chaque opération sur mon service, il est apparu que la programmation n'était pas la raison non plus. Le seul était laissé - paramètres de service. Donc, la raison en est que les champs de paramètres du fichier service.xml sur le service, qui nécessitent un type booléen, ne permettent pas de symboles supplémentaires. Mon erreur:

incorrect:

<parameter name="enableSwA"> 
     true 
    </parameter> 

Correct:

<parameter name="enableSwA">true</parameter> 
2

Vous pouvez utiliser tcpmon [1] pour suivre le message http et isoler le problème.

Quoi qu'il en soit, la meilleure méthode pour gérer les pièces jointes est d'utiliser MTOM. Ce qui peut être utilisé avec des frameworks de liaison de données comme ADB [2], ou encore avec POJO.

merci, Amila.

[1] http://ws.apache.org/commons/tcpmon/

[2] http://amilachinthaka.blogspot.com/2009/01/using-mtom-with-axis2.html

+0

Merci, j'ai essayé TCPmon. Le résultat est dans le premier post :) – Eadel

Questions connexes