Tenemos una interfaz de servicio web SOAP existente que queremos implementar utilizando WCF para una nueva aplicación. Esto parece funcionar bien, excepto por un pequeño detalle. El espacio de nombres XML del tipo de devolución de una función debe ser diferente del espacio de nombres XML del servicio web en sí. Y por mi vida, no puedo hacer que funcione.Cómo personalizar la serialización XML de WCF
He vuelto a crear el mismo problema con un pequeño proyecto de muestra. La interfaz WCF:
[XmlSerializerFormat]
[ServiceContract(Namespace = "urn:outer-namespace")]
public interface IService1
{
[OperationContract]
MyClass DoStuff(int value);
}
[Serializable]
public class MyClass
{
[XmlElement(ElementName = "DataString")]
public string MyString { get; set; }
}
La implementación del servicio web:
public class Service1 : IService1
{
public MyClass DoStuff(int value)
{
return new MyClass { MyString = "Wooh!" };
}
}
Una respuesta de este servicio web es serializado entonces como: (cosas de SOAP La omisión)
<DoStuffResponse xmlns="urn:outer-namespace">
<DoStuffResult>
<DataString>Wooh!</DataString>
</DoStuffResult>
</DoStuffResponse>
pero queremos el <DoStuffResult> para ser de xmlns = "urn: inner-namespace".
He intentado agregar un [return: XmlElement (...)] en la función de interfaz o en la función del servicio web, pero eso no funciona. Además, un [XmlType] o [XmlRoot] en la definición de la clase MyClass no funciona.
¿Alguien tiene una idea de cómo cambiar el espacio de nombres XML serializado (o nombre de elemento) del objeto que es el valor de retorno de una función de servicio web WCF?
Como ya dije en la pregunta, he intentado añadir un atributo XmlRoot y no funcionó. Solo agrega el espacio de nombres a los campos dentro de MyClass, pero no a MyClass. El DataContract tampoco funciona, y prefiero XmlSerializer porque el cambio de nombre y el orden no son importantes en ese momento. –
Utilicé svcutil, pero sin especificar un serializador y generó una combinación de MessageContract y ServiceContract con XmlSerializer. Por lo tanto, tiene uno o dos contenedores y aún puedo usar los atributos XML para que todo funcione. –