visual svcutil studio partir microsoft language from create crear .net web-services class proxy-classes

.net - svcutil - wsdl language cs



Forzar el servicio web.NET para usar la clase de objeto local, no la clase de proxy (3)

Tengo un servicio web al que llamo 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 desde otro lugar del proyecto; es un objeto común que ellos ambos comparten una referencia, ya que está en el tercer proyecto de mi solución. Cuando llamo al servicio web, devuelve un objeto "Persona", pero está en el espacio de nombres del servicio web y se crea a partir de una clase proxy que el servicio web generó. Como tal, no puedo manipularlo y devolverlo a mi programa, que está esperando un objeto "Persona" basado en la copia compartida de la clase, no una copia proxy del espacio de nombres del servicio web, y me sale un error cuando intento para CTypear al tipo de clase correcto.

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

De nota: he recurrido a pasar todos los parámetros ByRef y usar esos valores devueltos para rellenar una copia del objeto que creo a la vuelta. Esa no puede ser la mejor manera de hacer esto!


No estoy seguro, pero cuando compile un servicio web .NET, creará un archivo DLL que puede probar utilizando para el local. Pero cuando estoy construyendo 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 controladora y, por ejemplo, en la Capa controladora, 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 invocarlo 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 usando ese método que devolverá un bool o nombre de usuario, etc.


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 en la clase proxy generada y modificarla para usar los espacios de nombres correctos o usar la clase ChannelFactory para crear un proxy dinámico para usted.

La primera solución es muy frágil y hará que modifiques la clase proxy cada vez que cambie la interfaz del servicio. La segunda técnica funciona bastante bien y la utilizamos 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 con la última versión de la interfaz.

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


Si está utilizando svcutil.exe para generar un proxy de cliente WCF, puede usar / referencia en la línea de comando para especificar el ensamblado 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 de proxy de servicio.

Además, esto funcionará solo si su clase común es serializable y aprobada por valor (es decir, está expuesta como un contrato de datos, no como un contrato de servicio).