У меня есть служба SOAP, которая возвращает этот ответ:
<Soap:Envelope xmlns:Soap="http://schemas.xmlsoap.org/soap/envelope/">
<Soap:Body>
<Read_Result xmlns="urn:microsoft-dynamics-schemas/page/salesorder">
<SalesOrder>
<Key>28;JAAAAACLAQAAAAJ7BDEAMAAwADE=6;4923601;10;SalesLines2;36;JQAAAACLAQAAAAJ7BDEAMAAwADEAAAAAhxAn6;4923840;36;JQAAAACLAQAAAAJ7BDEAMAAwADEAAAAAhyBO7;15066990;</Key>
<No>1001</No>
<Sell_to_Customer_No>01905899</Sell_to_Customer_No>
<SalesLines>
<Sales_Order_Line>
<Key>36;JQAAAACLAQAAAAJ7BDEAMAAwADEAAAAAhxAn6;4923840;</Key>
<Type>Item</Type>
<FilteredTypeField>Item</FilteredTypeField>
<No>1000</No>
<Quantity>6</Quantity>
</Sales_Order_Line>
<Sales_Order_Line>
<Key>36;JQAAAACLAQAAAAJ7BDEAMAAwADEAAAAAhyBO7;15066990;</Key>
<Type>Item</Type>
<FilteredTypeField>Item</FilteredTypeField>
<No>1150</No>
<Quantity>5</Quantity>
</Sales_Order_Line>
</SalesLines>
</SalesOrder>
</Read_Result>
</Soap:Body>
</Soap:Envelope>
Я читал, что в XMLSerializer есть ограничение, используемое сгенерированными WCF прокси-классами:
Использованиевложенные сложные типы в сообщении SOAP - WCF XmlSerializer
https://social.msdn.microsoft.com/Forums/vstudio/en-US/3268fd25-4a1d-46af-82ad-edcdb555de69/limitations-of-xmlserializer-what-objects-cannot-be-serialized?forum=csharpgeneral
Итак, я пытаюсь использовать подход для добавления MessageInspector - который читает запрос SOAP и выполняет некоторыеФорматирование XML (чтобы десериализация работала нормально) - вы можете прочитать об этом по этой ссылке.
Проблема с разделом SalesLines, так как мой прокси-сервер WCF возвращает его как ноль
Любые идеичто именно мне нужно изменить в своем примере SOAP XML-ответа, чтобы сделать его «совместимым» с XMLSerializer WCF?
Это основной код, который я планирую использовать:
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
// Read reply payload
XmlDocument doc = new XmlDocument();
MemoryStream ms = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ms);
reply.WriteMessage(writer);
writer.Flush();
ms.Position = 0;
doc.Load(ms);
// Change logic
//ChangeMessage(doc); //Here I will do the required modifications
// Write the reply payload
ms.SetLength(0);
writer = XmlWriter.Create(ms);
doc.WriteTo(writer);
writer.Flush();
ms.Position = 0;
XmlReader reader = XmlReader.Create(ms);
reply = System.ServiceModel.Channels.Message.CreateMessage(reader, int.MaxValue, reply.Version);
}