2012-01-10 22 views
5

Sto consumando un servizio Web in cui invio una richiesta con un allegato e riceviamo una risposta dal server con varie informazioni. Ho documentato alcuni problemi con l'ottenimento della richiesta insieme in un'altra domanda Adding an attachment to SOAP request ma questo bit è stato risolto e ora un altro problema è apparso sulla risposta.Risposta al sapone, XML non ben formato, senza parti XOP localizzate, utilizzando WSE

riceviamo la risposta ok, ma viene generato un errore affermando:

risposta non è ben formato XML.

L'InnerException è:

WSE1608: Nessuna parte XOP erano situati nel flusso per il specificato Content-ID: < rootpart*[email protected] sun.com >

L'XML restituito assomiglia a:

--uuid:36875c60-630c-4e23-9e74-f9a9c7547fc7 
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"; 
Content-ID: <rootpart*[email protected]> 
content-transfer-encoding: binary 

    <?xml version="1.0" encoding="utf-8"?> 
    <soapenv:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <payloadManifest xmlns="http://(namespace)"> 
     <manifest contentID="content0" element="ProcessAttachment" namespaceURI="http://(namespace)" version="2.01"/> 
     </payloadManifest> 
    </soapenv:Header> 
    <soapenv:Body> 
     <tran:ProcessMessageResponse xmlns="http://(namespace)" xmlns:ns2="http://(ns2Namespace)" xmlns:ns3="http://(ns3Namespace)" xmlns:tran="http://(tranNamespace)"> 
     <tran:payload> 
      <tran:content id="content0"> 
      <s:ShowServiceProcessingAdvisory xmlns:s="http://(sNamespace)"> 
       <s:ApplicationArea> 
       <s:Sender> 
        <s:Component>Global Warranty Management</s:Component> 
        <s:Task>ShowAttachments</s:Task> 
        <s:CreatorNameCode>Creator</s:CreatorNameCode> 
        <s:SenderNameCode>GM</s:SenderNameCode> 
       </s:Sender> 
       <s:CreationDateTime>2012-01-10T12:58:27Z</s:CreationDateTime> 
       <s:Destination> 
        <s:DestinationNameCode>XX</s:DestinationNameCode> 
        <s:DealerNumber>234567</s:DealerNumber> 
        <s:DealerCountry>US</s:DealerCountry> 
       </s:Destination> 
       </s:ApplicationArea> 
       <s:DataArea> 
       <s:Show/> 
       <s:ServiceProcessingAdvisory> 
        <s:Header> 
        <s:SecondaryDealerNumber>253909</s:SecondaryDealerNumber> 
        <s:Disposition> 
         <s:RepairOrder> 
         <s:WarrantyClaim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:WarrantyClaimExtended"> 
          <s:OEMClaimNumber>00112233445566778899</s:OEMClaimNumber> 
          <gwm:Attachment xmlns:gwm="http://(gwmNamespace)"> 
          <gwm:AttachmentId>5678987</gwm:AttachmentId> 
          <gwm:Filename>14.jpg</gwm:Filename> 
          </gwm:Attachment> 
         </s:WarrantyClaim> 
         </s:RepairOrder> 
        </s:Disposition> 
        </s:Header> 
       </s:ServiceProcessingAdvisory> 
       </s:DataArea> 
      </s:ShowServiceProcessingAdvisory> 
      </tran:content> 
     </tran:payload> 
     </tran:ProcessMessageResponse> 
    </soapenv:Body> 
    </soapenv:Envelope> 

    --uuid:36875c60-630c-4e23-9e74-f9a9c7547fc7-- 

Suppongo che si tratti di un errore dovuto alle parti MIME, ma come dovrebbe essere gestito?

Posso solo aggiungere che questo è esattamente lo stesso XML restituito in SoapUI ed è l'XML restituito previsto. Inoltre, potrei aggiungere che WSE è necessario per 2 motivi, perché lo sviluppatore di terze parti del servizio web rifiuta di cambiare i loro metodi di lavoro, e abbiamo anche una dipendenza da VS 2005 e quindi non possiamo utilizzare WCF, specialmente con una scadenza incombe su di noi

EDIT: La risposta reale che ricevo è al di sotto, ho formattato in precedenza per la facilità di lettura

HTTP/1.1 200 OK 
Date: Mon, 16 Jan 2012 09:44:22 GMT 
Server: ACE XML Gateway 
Cache-Control: no-cache="Set-Cookie" 
Set-Cookie: JSESSIONID=h3LnPTxYdZJ3wp4zFl2GV3BYQ7fZD1p8WbvPgl1Qq95g1F9GQhMC!1396094632; path=/ 
X-Powered-By: Servlet/2.5 JSP/2.1 
Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:a9a94e4e-5134-4995-8884-dfd4d65b7784"; start="<rootpart*[email protected]>"; start-info="text/xml" 
Content-Length: 2296 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 


--uuid:a9a94e4e-5134-4995-8884-dfd4d65b7784 
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"; 
Content-ID: <rootpart*[email protected]> 
content-transfer-encoding: binary 

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><payloadManifest xmlns="http://www.starstandards.org/webservices/2005/10/transport"><manifest contentID="content0" element="ProcessAttachment" namespaceURI="http://www.starstandards.org/STAR" version="2.01"/></payloadManifest></soapenv:Header><soapenv:Body><tran:ProcessMessageResponse xmlns="http://www.starstandards.org/STAR" xmlns:ns2="http://www.gm.com/2006/GWM" xmlns:ns3="http://www.starstandards.org/webservices/2005/10/transport" xmlns:tran="http://www.starstandards.org/webservices/2005/10/transport"><tran:payload><tran:content id="content0"><s:ShowServiceProcessingAdvisory xmlns:s="http://www.starstandards.org/STAR"><s:ApplicationArea><s:Sender><s:Component>Global Warranty Management</s:Component><s:Task>ShowAttachments</s:Task><s:CreatorNameCode>General Motors</s:CreatorNameCode><s:SenderNameCode>GM</s:SenderNameCode></s:Sender><s:CreationDateTime>2012-01-16T09:44:24Z</s:CreationDateTime><s:Destination><s:DestinationNameCode>XX</s:DestinationNameCode><s:DealerNumber>253909</s:DealerNumber><s:DealerCountry>US</s:DealerCountry></s:Destination></s:ApplicationArea><s:DataArea><s:Show/><s:ServiceProcessingAdvisory><s:Header><s:SecondaryDealerNumber>253909</s:SecondaryDealerNumber><s:Disposition><s:RepairOrder><s:WarrantyClaim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:WarrantyClaimExtended"><s:OEMClaimNumber>001116695583</s:OEMClaimNumber><gwm:Attachment xmlns:gwm="http://www.gm.com/2006/GWM"><gwm:AttachmentId>5677606</gwm:AttachmentId><gwm:Filename>1127.jpg</gwm:Filename></gwm:Attachment></s:WarrantyClaim></s:RepairOrder></s:Disposition></s:Header></s:ServiceProcessingAdvisory></s:DataArea></s:ShowServiceProcessingAdvisory></tran:content></tran:payload></tran:ProcessMessageResponse></soapenv:Body></soapenv:Envelope> 

--uuid:a9a94e4e-5134-4995-8884-dfd4d65b7784-- 
+0

Potrebbe mostrare risposta completa, soprattutto a partire dal 'HTTP/1.0'? –

+0

La risposta completa è sopra. – anothershrubery

+0

Il problema è stato risolto? Sto affrontando lo stesso problema. Puoi condividere i tuoi insegnamenti/risultati? Grazie in anticipo. – Nayan

risposta

2

Non so se fosse una svista durante la creazione del post, ma se la risposta effettivamente avere due spazi prima della dichiarazione <?xml?>, quindi quello è l'errore di sintassi. Se si verifica una dichiarazione XML, DEVE essere la prima cosa nel documento, nient'altro (nemmeno gli spazi) prima.

http://www.w3.org/TR/REC-xml/#sec-prolog-dtd

eliminazione di questi spazi, il documento sembra ben-formato, in modo da non so che altro sarebbe.

+0

Ho formattato l'xml solo per facilità di lettura, la risposta HTTP completa, come ricevuta, è mostrata sopra ora. – anothershrubery

2

A causa della prima riga, il tuo XML sarà valido solo se è archiviato e aperto in formato UTF-8. Se dovessi salvarlo nel blocco note, ad esempio, e salvarlo come "sample.xml", quando lo apri in Internet Explorer lo visualizzerà come un XML ben formato.

Tuttavia, se si dovesse caricare questa risposta, ad esempio in una stringa Unicode e trasmetterla a un parser XML, si lamenterà che la stringa è Unicode mentre il contenuto è UTF-8.

Una soluzione semplice consiste nel rimuovere la riga prima di inviarla al parser XML. Questo ti darà il successo iniziale, ma, alla fine, per correttezza, se ti aspetti di avere internazionalizzazione, dovresti fornire il tuo contenuto al parser XML come un flusso di byte.

+0

Purtroppo siamo stati avvisati che il modo in cui la nostra richiesta è formattato non è accettato da parte del terzo, anche se funziona! Quindi dobbiamo trovare un'altra soluzione per la richiesta. E non abbiamo alcun controllo su ciò che il server ci invia, è un servizio web di terzi. – anothershrubery

+1

Questo è un peccato, si ottiene quel contenuto extra "--uuid" che rompe l'XML. Forse tornare alle basi con WebRequest e HttpWebRequest e usare il violinista come strumento di debug del Web sarebbe la strada da percorrere in quel momento. –

2

è possibile utilizzare gli operatori di stringa per estrarre solo le 2 righe contenenti il ​​codice xml.per esempio se si utilizza JavaScript si

  • uso indexOf("<?xml") per ottenere l'avvio di codice XML nella stringa (quella che containt la risposta completa)
  • uso lastIndexOf("--uuid") per ottenere la fine del codice XML
  • calc lastIndexOf("--uuid") - indexOf("<?xml") avere la lunghezza di codice
  • infine utilizzare substr(xmlstart, xmllength) avere parte xML della risposta

tutto questo ne EDS da fare dopo aver ricevuto risposta e prima di analizzare come XML

se non si utilizza JavaScript si può fare lo stesso utilizzando espressioni regolari

nel caso ancora peggio, se l'ambiente non lo fa supporta nessuna delle cose che ho detto, si può andare per un vecchio modo: linea di lettura per riga, la prima volta che trova un "<" come primo carattere, salvare quella linea, per saperne di più uno e fermarsi.

+1

regexp potrebbe essere qualcosa come '/ () /' questo prenderà la linea con il codice e potrebbe essere necessario anteporre manualmente la linea ' user1040495

Problemi correlati