wcf namespaces xml-serialization xmlserializer

wcf - Prefix SOAP XML En lugar de espacio de nombres directo



namespaces xml-serialization (1)

Estoy trabajando con uno de nuestros socios para integrar nuestros servicios comerciales. Estoy usando WCF (.Net 3.5) para comunicarme con el servicio web asociado. Creo que el servicio web asociado está escrito en Java.

Utilizando SVC util genere una clase de proxy. En lugar del serializador DataContract, svcutil usó xmlserializer. Pero WSDL proporcionado por el socio y la respuesta del servicio web SOAP xml no coincide. Como el socio no está interesado en cambiar el wsdl, he cambiado el WSDL descargado manualmente para que coincida con la respuesta. Ese problema ha sido arreglado.

Ahora me encuentro con un problema diferente. Cuando envío una solicitud al servicio web, siempre falla. Luego usé fiddler para obtener la solicitud SOAP reenviada al socio. El socio dijo que los espacios de nombres xml enviados por la solicitud no validan sus sistemas. También respondieron con una solicitud SOAP de muestra.

Al comparar las dos solicitudes, el espacio de nombres se ve correcto. Pero el asociado xml usa los prefijos para definir los espacios de nombres y los elementos tienen el prefijo. Mientras que xml en nuestro lado no tiene prefijos en su lugar, usamos los espacios de nombres directamente en el elemento padre.

Aquí está el XML que enviamos

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <iL21stCentRq xmlns="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing"> <ACORD xmlns="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing"> <SignonRq xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"> <SignonPswd> <CustId> <SPName>111</SPName> </CustId> </SignonPswd> </SignonRq> </ACORD> </iL21stCentRq> </s:Body>

Aquí está el XML de muestra que el socio esperaba de nosotros

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stc="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing" xmlns:stc1="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing" xmlns:acd="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"> <soapenv:Header/> <soapenv:Body> <stc:iL21stCentRq> <stc:input> <stc1:ACORD> <acd:SignonRq> <acd:SignonPswd> <acd:CustId> <acd:SPName>yourcompany.com</acd:SPName> </acd:CustId> </acd:SignonPswd> </acd:SignonRq> </stc1:ACORD> </stc:input> </stc:iL21stCentRq> </soapenv:Body>

Si compara los dos XML, el espacio de nombres http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/ tiene el prefijo "acd" en el asociado xml y no lo hace. Partner quería que le enviáramos ese formato.

Creo que Partner Xml no sigue los estándares. Este es realmente un problema de pareja. Pero no me quedaba otra opción y necesitaba cambiar el Xml de mi lado.

Aunque pudimos personalizar la serialización en el servicio WCF, no estoy seguro de que sea posible cambiar el prefijo en este nivel. Además, no estoy seguro de que el Partner Xml siga los estándares de XSD.

Si pudiera guiar para modificar la serialización de WCF para acomodar los cambios mencionados anteriormente, lo agradecería.


Solucioné la clase de proxy generada por SVC Util. Agregué una nueva propiedad que emite el prefijo. Por ejemplo, en la clase SignonRq, agregué la siguiente propiedad. Que serializó el XML con el prefijo acd

[XmlNamespaceDeclarations()] public XmlSerializerNamespaces xmlsn { get { XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); xsn.Add("acd", "http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"); return xsn; } set { //Just provide an empty setter. } }

Por ejemplo, clase ACORD, agregué la siguiente propiedad. Eso serializó el XML con el prefijo stc1.

[XmlNamespaceDeclarations()] public XmlSerializerNamespaces xmlsn { get { XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); xsn.Add("stc1", "http://schemas.WebServiceProvider.com/us/ileads/types/Servicing"); return xsn; } set { //Just provide an empty setter. } }