Я использую стороннюю веб-службу, которая возвращает объект с помощью 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");
}
}
Если стандартный mtom используется, то до тех пор, пока вы установите кодировку сообщения, чтобы mtom не выполнял синтаксический анализ, вложение будет доступно в объекте ответа –
Можете ли вы предоставить все сообщение SOAP (или, еще лучше, весь MIME сообщение, за исключением закодированного вложения?) Кроме того, предоставьте соответствующие определения ServiceContract/DataContract. Вы должны убедиться, что DataMember, где вы хотите, чтобы декодирование MTOM произошло, имеет тип byte []. –
@EugeneOsovetsky Я добавил ответ SOAP и определение объекта. У меня нет моего личного контакта с данными, я использовал тот, который был создан WSDL. – Victor