Hemos observado que cuando exponemos un servicio WCF que utiliza clases decoradas con varios atributos de serialización xml, a pesar del hecho de que utilizamos el atributo XmlSerializerFormat en la interfaz cualquier atributo XmlRoot en cualquiera de los parámetros de la operación se ignora por completo. El espacio de nombre de los parámetros es siempre el del servicio y no el que especificamos.¿Por qué se ignora el atributo XmlRoot en WCF y cómo superarlo?
Esto nos causa problemas, ya que no parece ser compatible con ASMX y también porque estamos utilizando BizTalk, y necesitamos tener un control más estricto sobre la forma de los XML intercambiados.
Algunas preguntas a continuación -
- Alguien sabe cuál es el fundamento detrás de esta decisión?
- ¿Alguien sabe cómo está sucediendo esto? Estaba bajo las impresiones que WCF, con el atributo XmlSerializerFormat, utiliza el XmlSerialiser para serializar los tipos , lo que sugeriría XmlRoot deben tenerse en cuenta, cómo vienen este no es el caso? (¿Es sólo por el hecho de que, teniendo el sobre SOAP en cuenta, el parámetro no es root?)
- más importante - nadie sabe si hay una manera de 'forzar la situación' - es decir, obtener los parámetros para ser del espacio de nombre de nuestra elección?
que he visto this puesto, pero no creo que es relevante a mi pregunta -
Según la petición de Wagner Silveira - los contratos que utiliza para probar esto son -
[ServiceContract(Namespace = "http://servicecontract"),
XmlSerializerFormat(Style = OperationFormatStyle.Document)]
public interface ITestService
{
[OperationContract]
MyOtherType MyTestMethod(MyType obj);
}
// Composite class for DCS and XMLS
[Serializable, XmlType, XmlRoot(Namespace = "http://datacontract")]
public class MyType
{
[XmlAttribute]
public string StringValue { get; set; }
}
// Composite class for DCS and XMLS
[Serializable, XmlType, XmlRoot(Namespace = "http://datacontract")]
public class MyOtherType
{
[XmlAttribute]
public string OtherStringValue { get; set; }
}
Gracias John Calculamos la opción MessageContract, parece una gran molestia para algo que acaba de funcionar en ASMX, que es también la razón por la que no estaba seguro sobre el argumento del nodo no raíz, pero supongo que tiene sentido. Personalmente creo que eso es un gran golpe a la compatibilidad con versiones anteriores. –