visual studio generar fuente etiquetas documentar documentacion crear como codigo clases c# xml web-services wcf soap

c# - studio - Cómo analizar un mensaje de jabón cargado desde un archivo?



generar documentacion visual studio 2017 (2)

Debería poder usar XmlSerializer para lograr esto con la ayuda de SoapReflectionImporter .

var importer = new SoapReflectionImporter("ns2:PourtuIntf-IPourtu"); var mapping = importer.ImportTypeMapping(typeof(GetCRResponse)); var serializer = new XmlSerializer(mapping); var response = serializer.Deserialize(reader) as GetCRResponse;

La clase SoapReflectionImporter proporciona asignaciones de tipos a partes de mensajes codificadas en SOAP, tal como se define en un documento de Lenguaje de descripción de servicios web (WSDL). Se usa solo cuando un servicio web o un cliente especifica la codificación SOAP, como se describe en la Sección 5 de la especificación SOAP 1.1.

El siguiente comando fue utilizado para generar sus contratos de cliente de WSDL

SvcUtil.exe IPlotiservice.wsdl /t:code /serviceContract

Necesito analizar un mensaje SOAP que cargo desde el disco, al tipo del proxy generado. WCF lo hace cuando recibe el mensaje del servidor http, por lo que debería poder hacerlo desde el disco.

Consumir un servicio web con WCF, generé el cliente proxy desde el WSDL remoto.

Aquí está la estructura XML que recibí de la red (se registró con System.ServiceModel.MessageLogging) que quiero analizar en la clase generada 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]"> ...

Cuando llamo a la operación ''GetCR'' del servicio web, el mensaje se convierte correctamente al tipo de cliente proxy generado por WCF GetCRResponse, pero no sé cómo funciona WCF y necesito analizar el archivo desde el disco.

Traté de analizar el mensaje de esa manera:

GetCRResponse body; using (var xmlReader = XmlReader.Create("Requests//CR.xml")) { Message m = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11); body = m.GetBody<GetCRResponse>(); }

En el método GeyBody, esta excepción se plantea:

Expected element ''ActGetCRResponse'' from namespace ''http://schemas.datacontract.org/2004/07/Pourtu.PourtuClient''.. Detecting ''Element'' with name ''ActGetCRResponse'', namespace ''urn:PourtuIntf-IPourtu'' .

Intenté usar SoapFormatter:

using ( FileStream fs = new FileStream("Requests//CR.xml", FileMode.Open) ) { SoapFormatter formatter = new SoapFormatter(); body = (ActGetCRResponse)formatter.Deserialize(fs); }

..the Deserialize arroja la siguiente excepción: error de análisis, no ensamblado asociado a la clave xml ''ns2 GetCRResponse''.

No puedo usar el serializador xml para deserializar a GetCRResponse debido a los atributos SOAP-ENC: arrayType que deben ser interpretados por el serializador soap.


Actualizado:

Message m = Message.CreateMessage(XmlReader.Create("C://testSvc//login.xml"), int.MaxValue, MessageVersion.Soap11); SoapReflectionImporter importer = new SoapReflectionImporter(new SoapAttributeOverrides(), "urn:PlotiIntf-IPloti"); XmlTypeMapping mapp = importer.ImportTypeMapping(typeof(ActGetCRResponse)); XmlSerializer xmlSerializer = new XmlSerializer(mapp); var o = (ActGetCRResponse)xmlSerializer.Deserialize(m.GetReaderAtBodyContents());

referencia