Измените сообщение SOAP с помощью Array, чтобы его можно было сериализовать с помощью WCF XMLSerializer. - PullRequest
0 голосов
/ 03 октября 2018

У меня есть служба 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); 
}
...