Pregunta

Por mi otra publicación sobre valores de retorno del servicio WCF , estoy consumiendo un servicio web de otra compañía, y cuando agrego la referencia del servicio dentro de Visual Studio, el valor de retorno del método es un objeto de tipo objeto .

El autor del servicio web me mostró el código y, en realidad, devuelve un objeto escrito.

¿Me falta algo o se supone que la clase proxy devuelve un valor escrito?

¿Hay una configuración para generar la clase proxy o el servicio real?

UPDATE:

Observé las clases reales detrás del servicio WCF y me di cuenta de que el valor de retorno del método de servicio en realidad está devolviendo una interfaz , que implementa el tipo concreto. El tipo concreto está marcado con el atributo [DataContract] (y los atributos apropiados de [DataMember]), pero la interfaz no tiene tales atributos. ¿Podría esto estar causando que el servicio establezca el tipo de retorno como objeto?

¿Fue útil?

Solución

Hipotéticamente, si usted fuera el desarrollador del servicio, podría usar un KnownTypeAttribute :

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

No lo he intentado personalmente con una interfaz, pero lo he intentado con una clase base abstracta y funciona bien. Cuando el cliente recibe el valor de retorno, puede descender con éxito a la clase derivada.

Puede ser que el código de servicio realmente haga esto, y el problema radica en que svcutil.exe no genera las clases de proxy con la suficiente precisión.

Aunque no controla el código de servicio, sí controla el código de proxy del cliente. Puede intentar editar manualmente las clases de proxy que svcutil.exe le dio para agregar el KnownTypeAttribute usted mismo. Al hacer esto, usted está controlando el comportamiento del DataContractSerializer al final, y siempre que tenga cuidado de no cambiar el formato de conexión de los datos por error, todo debería seguir funcionando.

Otros consejos

La clase proxy es un archivo generado y, como tal, puede contener errores. Si tiene una copia del contrato de datos, puede cambiar la clase de proxy para usar el tipo correcto en lugar de System.Object y las cosas deberían funcionar correctamente.

El Visual Studio " Agregar referencia de servicio " tool y svcutil.exe son muy buenos para generar clases proxy pero no son perfectos. Los archivos que generan son suyos para modificar y le recomendaría que simplemente modifique la operación para devolver el contrato de datos adecuado.

Tuvimos un problema similar al consumir un servicio web java de WCF.

En nuestro caso, el tipo que decía que estaba devolviendo era una versión limitada de lo que realmente se estaba devolviendo.

Lo que funcionó para nosotros fue convertir el objeto al tipo que se esperaba. Después de eso los datos estuvieron disponibles.

Por lo tanto, para solucionar su problema, puede intentar convertir el objeto al tipo esperado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top