Pregunta

Tengo un servicio web al que estoy llamando desde una aplicación de formularios de Windows (ambos .NET, ambos en la misma solución), y me gustaría que mi servicio web devuelva un objeto personalizado de otra parte del proyecto. Es un problema común. objeto que ambos comparten una referencia, ya que está en el tercer proyecto en mi solución. Cuando llamo al servicio web, devuelve una " Persona " objeto, pero está en el espacio de nombres del servicio web, y se crea a partir de una clase de proxy que el servicio web mismo generó. Como tal, no puedo manipularlo y devolverlo a mi programa, que está esperando una " Persona " objeto basado en la copia compartida de la clase, no una copia proxy del espacio de nombres del servicio web, y recibo un error cuando trato de escribir CType al tipo de clase correcto.

¿Cómo fuerzo al servicio web a usar una copia local de la clase, no una copia proxy? ¿Tiene mi pregunta algún sentido en este contexto? Si no, lo aclararé.

Nota: he recurrido a pasar todos los parámetros ByRef y al usar esos valores devueltos para rellenar una copia del objeto que creé al regresar. ¡Esa no puede ser la mejor manera de hacer esto!

¿Fue útil?

Solución

Si está usando svcutil.exe para generar un proxy de cliente WCF, puede usar / referencia en la línea de comandos para especificar el ensamblaje que contiene la clase común. Svcutil debe reutilizar esa definición de clase en lugar de generar una nueva en el espacio de nombres del proxy de servicio.

Además, esto funcionará solo si su clase común se puede serializar y pasar por valor (es decir, se expone como un contrato de datos, no como un contrato de servicio).

Otros consejos

Si está utilizando WCF, es bastante fácil utilizar los mismos contratos de datos y la misma interfaz de servicio entre el cliente y el consumidor. Puede compilar la clase de proxy generada y modificarla para usar los espacios de nombres correctos o usar ChannelFactory para crear un proxy dinámico para usted.

La primera solución es muy frágil y hará que modifique la clase de proxy cada vez que cambie la interfaz del servicio. La segunda técnica funciona bastante bien y la usamos durante un proyecto anterior en el que trabajé. Con cualquiera de estos métodos, debe asegurarse de que todas las personas que llaman continúen al día con la última versión de la interfaz.

Por la forma en que describe el problema, parece que desea que el servicio y el cliente compartan la misma instancia. Como WCF serializa y deserializa sus tipos a medida que los envía y desde el servicio, tendría que hacer algo un poco más inteligente. ¿Es esto lo que quisiste decir?

No estoy seguro, pero cuando compiles un servicio web .NET, se creará un archivo DLL que puedes intentar usar para el local. Pero cuando estoy creando aplicaciones orientadas a servicios, creo diferentes capas dentro de mi solución para, por ejemplo, Capa de acceso a datos, Capa lógica, Capa de servicio, Capa UI, Capa del controlador y, por ejemplo, en la Capa del controlador Haré un método de autenticación de usuario que es conectado con la capa de acceso a datos y la capa lógica y luego llamaré a ese método en la capa de servicio y también puedo llamarlo en la capa UI y si lo llamo desde la capa UI se llama localmente, cuando quiero usarlo desde la capa de servicio, crearé un método web utilizando ese método que devolverá un bool o un nombre de usuario, etc.

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