Мне нужно разобрать сообщение SOAP, загружаемое с диска, в тип сгенерированного прокси. WCF делает это, когда он получает сообщение от http-сервера, поэтому я должен быть в состоянии сделать это с диска.
Я использую webservice с WCF, я создал прокси-клиент из удаленного WSDL.
Вот структура XML, полученная из сети (она была зарегистрирована в System.ServiceModel.MessageLogging), которую я хочу проанализировать сгенерированным классом CRResponse.:
<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:ns1="urn:PourtuIntf" xmlns:ns2="ns2:PourtuIntf-IPourtu">
<SOAP-ENV:Header/>
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns2:GetCRResponse>
<return>
<ResultCode>0</ResultCode>
<CR>
<Theme SOAP-ENC:arrayType="ns1:ItemType[5]">
<item>
<Key/>
<Section SOAP-ENC:arrayType="ns1:Section[3]">
...
Когда я вызываю операцию "GetCR" веб-службы, сообщение корректно преобразуется в созданный WCF-клиент клиентского типа GetCRResponse, но я не знаю, как работает WCF, и мне нужно проанализировать файл с диска.
Я попытался разобрать сообщение таким образом:
GetCRResponse body;
using (var xmlReader = XmlReader.Create("Requests\\CR.xml"))
{
Message m = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11);
body = m.GetBody<GetCRResponse>();
}
В методе GeyBody это исключение возникает:
Expected element 'ActGetCRResponse' from namespace 'http://schemas.datacontract.org/2004/07/Pourtu.PourtuClient'.. Detecting 'Element' with name 'ActGetCRResponse', namespace 'urn:PourtuIntf-IPourtu'
.
Я попытался использовать SoapFormatter:
using ( FileStream fs = new FileStream("Requests\\CR.xml", FileMode.Open) )
{
SoapFormatter formatter = new SoapFormatter();
body = (ActGetCRResponse)formatter.Deserialize(fs);
}
.. Deserialize выдает следующее исключение: Ошибка анализа, нет сборки, связанной с ключом xml 'ns2 GetCRResponse'.
Я не могу использовать сериализатор xml для десериализации для GetCRResponse из-за атрибутов SOAP-ENC: arrayType, которые нужно интерпретировать с помощью сериализатора мыла.