2009-03-16 30 views
8

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?

Respuesta

3

Defina espacios de nombres con la serialización XML (o, mejor) atributos de definición de contrato de datos.

p. Ej. con XML Serialization:

[Serializable, XmlRoot(namespace="http://example.com/eg1")] 
public class MyClass { 
    [XmlElement(ElementName = "DataString")] 
    public string MyString { get; set; } 
} 

e.g. Contrato con datos de serialización:

[DataContract(Namespace="http://example.com/eg2")] 
public class MyClass { 
    [DataMember] 
    public string MyString { get; set; } 
} 

EDITAR

Basado en el primer comentario, lo anterior no funciona, porque el deseo es establecer el espacio de nombres en la envoltura de jabón alrededor del mensaje, no en el mensaje mismo.

OperationContractAttribute no ofrece control de espacios de nombres, y no puedo ver ningún otro atributo WCF en un nivel de método.

Dos posibilidades: (1) Puede tener suficiente control al eliminar un nivel de abstracción y utilizar un Contrato de mensaje. (2) Obtenga el WSDL actual para el servicio (usando svcutil.exe), ajústelo manualmente para obtener los espacios de nombres que desee y luego use svcutil.exe nuevamente para generar el código, y observe el código resultante.

+0

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. –

+0

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. –

1

Después de días de buscar e intentar docenas de soluciones recomendadas; Finalmente pude lograr que WCF dejara de forzar el nombre de un contenedor contenedor al anexar Result al nombre del método del servicio web. El truco consistía en añadir el siguiente atributo decorador a la interfaz de servicios web:

[return:MessageParameter(Name = "whatIWantItNamed")] 

Este atributo se debe colocar/situada directamente después del atributo [OperationContract] (y justo antes de la Stub real) en la interfaz.

(I también tenía que añadir un atributo XmlSerializerFormat a todos los ServiceContract y OperationContract atributos.)

Cuestiones relacionadas