2009-07-22 9 views
16

Básicamente, tengo un tipo de servidor "Foo" con miembros X e Y. Cada vez que uso la "Agregar referencia de servidor" de Visual Studio, veo que el WSDL y el proxy generado añaden la palabra "Campo" a todos los miembros y cambie la carcasa de la primera letra. IE, "X" e "Y" se renombran "xField" y "yField". ¿Alguna idea de por qué está pasando esto? No puedo entender el patrón.¿Por qué WCF a veces agrega "Campo" al final de los tipos de proxy generados?

Detalles - Tengo un servicio web ASMX heredado que expone un tipo "Foo". Creé un nuevo servicio WCF que es un envoltorio alrededor de ese viejo servicio web: el nuevo servicio simplemente envuelve esos métodos y tal vez actualiza los valores de algunos campos, pero expone exactamente los mismos métodos y devuelve exactamente los mismos tipos. Intenté volver a crear los referenes varias veces, y siempre cambia el nombre de mis campos: la variable "STUFF" está expuesta en el wsdl y proxy como "sTUFFField". La variable "X" está expuesta como "xField", etc.

Lo curioso es que no puedo entender el patrón - Intenté crear un nuevo servicio web ASMX como prueba y envolviéndolo - las variables no se renombran entonces. Entonces no puedo entender el patrón de por qué/cuándo WCF cambia el nombre de las variables.

¿Alguien sabe?

+0

¿Importa? Si es así, ¿cómo importa? –

+2

Sí importa. Tengo dos casos de uso (para usuarios internos versus externos). Los usuarios internos pueden pasar por alto mi servicio de envoltura e ir directamente al servicio heredado subyacente (evitando así la necesidad de iniciar sesión). Los usuarios externos tienen que pasar por el servicio envoltorio y darle una contraseña, etc. Pero como los servicios internos y externos ahora dan diferentes nombres a los campos, no puedo compartir el mismo código para hablar con ambos servicios. Necesito escribir diferentes versiones del código para cada servicio. – tavistmorph

Respuesta

3

Normalmente, el proxy generado tendrá "XField" y "YField" como campos internos/protegidos/privados, y expondrá los valores a través de propiedades llamadas "X" e "Y". Me parece que existen opciones que puede establecer al crear el cliente proxy para ajustarlo a su gusto.

ACTUALIZACIÓN: no parece encontrar ningún modificador u opción para controlar este comportamiento. Puede depender de qué serializador (DataContractSerializer vs. XmlSerializer) use WCF para crear el proxy del cliente.

Al final, es más o menos una cuestión de estilo de codificación; funcionalmente, no debería marcar la diferencia.

Marc

+0

Correcto, así es como funciona NORMALMENTE, pero veo que los campos públicos cambian de nombre. Entonces los campos internos se llaman "XFieldField" y el acceso público se llama "XField". No es lo que quiero, y significa que la interfaz para el servicio envoltorio se vuelve diferente a la interfaz del servicio real. Entonces ya no puedo tratar los dos servicios de manera intercambiable. – tavistmorph

+0

Lo que es extraño e inesperado: ¿cómo se crea el proxy de cliente? ¿En Visual Studio o usando svcutil.exe? –

+0

Exactamente - extraño e inesperado. Solo está sucediendo en este proyecto, así que no puedo descifrar el patrón. Pero creé el proxy del cliente con Visual Studio, simplemente haciendo clic en "Agregar referencia de servicio". – tavistmorph

4

Yo tenía el mismo problema, pero yo era capaz de encontrar una solución.

En la interfaz si agrega la etiqueta [DataContractFormat] terminará con el caso "XFieldField". Pero si lo reemplaza con [XmlSerializerFormat] en la interfaz, no cambiará los nombres en el proxy generado.

19

Tuve el mismo problema, y ​​la respuesta de sergiosp me llevó en la dirección correcta. Solo agregue información adicional para ayudar a alguien más.

Añadiendo [System.ServiceModel.XmlSerializerFormatAttribute()] a la interfaz, y volver a generar el código del cliente resolvió el problema para mí.

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

gracias por la ayuda. También lo resolvió para mí, pero ¿tiene alguna idea de qué está haciendo ese código y cómo está resolviendo el problema? – batmaci

+1

@batmaci Cuando agrega "Referencia de servicio" en Visual Studio, WCF genera código de cliente para llamar al servicio. Utilizará el DataContractSerializer de manera predeterminada. Al agregar XmlSerializerFormatAttribute, WCF genera el código con XmlSerializer. Intente agregar una referencia de servicio una vez con XmlSerializerFormatAttribute y una vez sin, y compare las diferencias en el archivo de código generado (Reference.cs). – tgriffin

+0

No puedo creer que esta respuesta haya estado presente aquí durante 2 años. He estado buscando locamente SO y la web para esta respuesta. Esta es literalmente una respuesta a mi oración. En caso de que les resulte útil a las personas del futuro que encuentren este mismo problema, [aquí] (http://stackoverflow.com/a/20713299/2453110) está el enlace a mi pregunta similar sobre la creación de un detector de eventos de DocuSign para su servicio de notificación de Connect. –

0

tuve este problema también, pero desde el cliente todavía estaba recibiendo Field al final de los miembros de la clase, incluso después de realizar el cambio mencionado en la interfaz.

El problema era que estaba usando un DataContractSerializer para trabajar con solicitudes serializadas de archivos de disco (durante la prueba de nuestro servicio, recibimos solicitudes serializadas del proveedor, para poder depurar antes de la activación).

Después de cambiar el DataContractSerializer a un XmlSerializer, especificando en su constructor el elemento raíz (por una llamada typeof()) y el RootNamespace (porque por defecto, XmlSerializers escribir el espacio de nombres estándar), podría deserializar las solicitudes y trabajar perfectamente con el Servicio WCF.

Espero que esto ayude a alguien. Perdí muchísimo tiempo con este "problema".

Cuestiones relacionadas