2012-01-10 1 views
5

Я использую веб-службу, в которой я отправляю запрос с вложением, и мы получаем ответ с сервера с различной информацией. Я документировал некоторые проблемы с получением запроса вместе в другом вопросе Adding an attachment to SOAP request, но этот бит был разрешен, и теперь на ответ возникла другая проблема.Мыльный отклик, не совсем сформированный XML, не содержит частей XOP, используя WSE

Мы получаем ответ в порядке, но выдается ошибка с указанием:

Ответ не очень хорошо сформированный XML.

InnerException является:

WSE1608: Нет XOP части были расположены в потоке для указанного содержимого ID: < rootpart*36875[email protected] sun.com >

XML-, возвращенного выглядит следующим образом:

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

Я предполагаю, что это ошибка из-за частей MIME, но как это следует обрабатывать?

Могу ли я просто добавить, что это тот же самый XML, возвращаемый в SoapUI, и является ожидаемым возвращенным XML. Кроме того, я могу добавить, что WSE требуется по двум причинам, потому что сторонний разработчик веб-службы отказывается изменять свои методы работы, а также мы полагаемся на VS 2005 и поэтому не можем использовать WCF, особенно с крайним сроком нависшей над нами.

EDIT: Фактический ответ я получаю ниже, я форматировал его выше для удобства чтения

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

Не могли бы вы показать полный ответ, особенно начиная с 'HTTP/1.0'? –

+0

Полный ответ выше. – anothershrubery

+0

Разве ваша проблема решена? Я столкнулся с той же проблемой. Не могли бы вы поделиться своими знаниями/поисками? Thx заранее. – Nayan

ответ

2

Я не знаю, было ли это упущение при создании поста, но если ответ делает действительно имеют два пробела перед объявлением <?xml?>, то это синтаксическая ошибка. Если объявление xml происходит, оно ДОЛЖНО быть первым в документе, ничем другим (даже пропуском) в первую очередь.

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

Удаление этих пространств, документ выглядит хорошо сформирован, так что я не знаю, что еще было бы.

+0

Я отформатировал xml только для удобства чтения, полный HTTP-ответ, полученный, показан выше. – anothershrubery

2

Из-за первой строки ваш XML будет действителен только в том случае, если он хранится и открывается в формате UTF-8. Если вы хотите сохранить это в блокноте, скажем, и сохранить его как «sample.xml», когда вы откроете его в Internet Explorer, он отобразит его как хорошо сформированный XML.

Однако, если вы должны были загрузить этот ответ, скажем, в строку Юникода и передать его в синтаксический анализатор XML, он будет жаловаться, что ваша строка является Unicode, тогда как контент UTF-8.

Одно из простых решений заключается в том, чтобы разделить линию перед подачей на ваш XML-парсер. Это даст вам первоначальный успех, но, в конечном счете, для правильности, если вы ожидаете интернационализации, вы должны предоставить свой контент вашему парсеру XML в виде потока байтов.

+0

К сожалению, нам сообщили, что способ форматирования нашего запроса не принимается третьим лицом, даже если он работает! Поэтому нам нужно найти другое решение для запроса. И мы не имеем никакого контроля над тем, что сервер отправляет нам, это сторонний веб-сервис. – anothershrubery

+1

Это облом, вы получаете дополнительный контент «--uuid», который разбивает XML. Возможно, возвращение к основам с помощью WebRequest и HttpWebRequest и использование скрипача в качестве инструмента веб-отладки было бы возможным. –

2

вы можете использовать операторы строк, чтобы просто извлечь две строки, содержащие xml-код.например, если вы используете Javascript вы

  • использование indexOf("<?xml"), чтобы получить начало XML-кода в строке (тот, который containt полный ответ)
  • использование lastIndexOf("--uuid") получить конец XML-кода
  • известково lastIndexOf("--uuid") - indexOf("<?xml"), чтобы получить длину кода
  • наконец использовать substr(xmlstart, xmllength), чтобы получить XML часть ответа

все это пе ред быть сделано после того, как вы получите ответ и, прежде чем разобрать его, как XML

, если вы не используете Javascript вы можете сделать то же самое с помощью регулярных выражений

в еще худшем случае, если среда не поддерживайте любую из вещей, о которых я сказал, вы можете пойти по-старому: читайте по строкам, когда вы сначала найдете «<» в качестве первого символа, сохраните эту строку, прочитайте еще одну и остановите.

+1

regexp может быть чем-то вроде '/ () /' это поймает строку с кодом, и вам может потребоваться вручную добавить строку ' user1040495

Смежные вопросы