2013-06-26 6 views
1

Я использую стороннюю веб-службу, которая возвращает объект с помощью PDF, прикрепленного с использованием кодировки MTOM.Не удается разобрать ответ MTOM

Объект структурирован как Data[] с каждым элементом массива, имеющим поля ContentType и Include.

Когда я запускаю метод веб-службы, он завершает тон запроса, но он не анализирует ответ должным образом, так как поле Include обрабатывается как null.

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

Это то, что отправляется в SOAP:

<m:GetDocImageResponse> 
    <x:data> 
     <x:item xmime5:contentType="*/*"> 
     <xop:Include href="cid:id1"/></x:item> 
    </x:data> 
</m:GetDocImageResponse> 

Я вижу, что Include имеет свойство href и это содержит ссылку на двоичный PDF документ.

Я пытаюсь разобрать объект в соответствии с WSDL:

Data[] retObject = null; 
using (blahWS ws = new blahWS()) 
{ 
try{ 
retObject = ws.GetDoc(parameters); //request completes with no errors, but `Include` is parse as null 
[...] 
    } 
catch 
{..} 
} 

Ссылка веб-сервис используется с простой basicHttpBinding

<basicHttpBinding> 
    <binding name="BasicHTTPwithMTOM" messageEncoding="Mtom" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" />   
</basicHttpBinding> 

Должен ли я быть разборе ответа по-разному? Почему он не анализирует поля?

EDIT:

Полный SOAP Ответ:

HTTP/1.1 200 OK 
Server: gSOAP/2.7 
Content-Type: multipart/related; charset=utf-8; boundary="==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B=="; type="application/xop+xml"; start="<SOAP-ENV:Envelope>"; start-info="text/xml" 
Content-Length: 180557 
Connection: close 

--==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B== 
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <SOAP-ENV:Envelope> 

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xmime5="http://www.w3.org/2005/05/xmlmime" xmlns:m="http://www.mcleodsoftware.com/wsdl/ws4v.wsdl" xmlns:x="http://www.mcleodsoftware.com/schemas/ws4v.xsd"> 
<SOAP-ENV:Body> 
    <m:GetDocImageResponse> 
     <x:data> 
      <x:item xmime5:contentType="*/*"> 
       <xop:Include href="cid:id1"/></x:item> 
     </x:data> 
    </m:GetDocImageResponse> 
</SOAP-ENV:Body> 

--==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B== 
Content-Type: */* 
Content-Transfer-Encoding: binary 
Content-ID: <id1> 
...binary... 

определение данных построена с использованием WSDL при условии:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mcleodsoftware.com/schemas/ws4v.xsd")] 
public partial class Data : object, System.ComponentModel.INotifyPropertyChanged { 

    private Include includeField; 

    private string contentTypeField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.w3.org/2004/08/xop/include", Order=0)] 
    public Include Include { 
     get { 
      return this.includeField; 
     } 
     set { 
      this.includeField = value; 
      this.RaisePropertyChanged("Include"); 
     } 
    } 
+1

Если стандартный mtom используется, то до тех пор, пока вы установите кодировку сообщения, чтобы mtom не выполнял синтаксический анализ, вложение будет доступно в объекте ответа –

+0

Можете ли вы предоставить все сообщение SOAP (или, еще лучше, весь MIME сообщение, за исключением закодированного вложения?) Кроме того, предоставьте соответствующие определения ServiceContract/DataContract. Вы должны убедиться, что DataMember, где вы хотите, чтобы декодирование MTOM произошло, имеет тип byte []. –

+0

@EugeneOsovetsky Я добавил ответ SOAP и определение объекта. У меня нет моего личного контакта с данными, я использовал тот, который был создан WSDL. – Victor

ответ

0

кажется, что ваш WSDL explici tly предоставляет схему для элемента. Я почти уверен, что это неправильно, а не стандартно. Элемент должен быть объявлен просто типа XSD: base64Binary (например, см https://wiki.duraspace.org/display/GSOC/MTOM+Support+on+the+WSDL+Level), существуют и другие стандартизированные compliants способов сказать в вашем WSDL, который вы используете MTOM (например, см http://www.w3.org/Submission/WS-MTOMPolicy/)

Если вы фиксируете ваш WSDL должен соответствовать стандартам (или, по крайней мере, с тем, что WCF ожидает «MTM WSDL»), я думаю, что все должно работать. Фактически, если вы хотите посмотреть, как выглядит «MTOM WSDL», просто создайте простой код службы MTOM - сначала в WCF - например. http://msdn.microsoft.com/en-us/library/aa395209.aspx - и посмотрите на WSDL и XSD, которые он производит.