2008-08-09 6 views
7

Todavía soy nuevo en el mundo de ASP.NET, así que podría estar muy lejos de la base aquí, pero hasta ahora esto es lo mejor de mi (limitado) conocimiento !ASP.NET Web Service Results, Proxy Classes y Type Conversion

Digamos que tengo un objeto comercial estándar "Contacto" en el Business namespace. Escribo un servicio web para recuperar la información de un contacto de una base de datos y devolverla. Luego escribo una solicitud de cliente para solicitar dichos detalles.

Ahora, también creo un método de utilidad que toma un "Contacto" y hace algo de magia con él, como Utils.BuyContactNewHat() decir. Que por supuesto toma el contacto del tipo Business.Contact.

luego vuelvo a mi aplicación cliente y desea utilizar el método BuyContactNewHat, por lo que añadir una referencia a mi espacio de nombres Utilidades y ahí está. Sin embargo, surge un problema con:

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

Dado que el tipo de retorno de GetContact es de MyWebService.Contact y no Business.Contact como se esperaba. Entiendo por qué es así, porque al acceder a un servicio web, en realidad está programando contra la clase de proxy generada por el WSDL.

Entonces, ¿hay una manera "más fácil" de lidiar con este tipo de discrepancia? Estuve considerando quizás intentar crear una clase de convertidor genérico que use la reflexión para asegurar que dos objetos tengan la misma estructura, que simplemente transfiriendo los valores de uno a otro.

Respuesta

4

Estás en el camino correcto. Para volver a obtener los datos del objeto proxy en uno de sus propios objetos, debe hacer el código de la mano izquierda con la mano derecha. es decir, copiar los valores de las propiedades. Apuesto a que ya existe un método genérico que utiliza la reflexión.

Algunas personas usarán algo más que un servicio web (.net remoto) si solo quieren obtener un objeto comercial a través del cable. O usarán serialización binaria. Supongo que está utilizando el servicio web por alguna razón, por lo que tendrá que copiar la propiedad.

4

En realidad, no tiene que usar la clase generada que le proporciona el WSDL. Si echas un vistazo al código que genera, solo está realizando llamadas a algunas clases de .NET Framework para enviar solicitudes SOAP. En el pasado he copiado ese código en un archivo .cs normal y lo he editado. Aunque no lo he probado específicamente, no veo ninguna razón por la que no pueda eliminar la definición de la clase proxy y usar la clase original para recibir los resultados de la llamada SOAP. Ya debe estar haciendo una reflexión bajo el capó, parece una pena hacerlo dos veces.

1

Le recomendaría que lea la extensión del importador de esquemas, que puede usar para controlar la generación del código proxy. Este enfoque se puede usar para (con gracia) resolver su problema sin kludges (como copiar objetos de un espacio de nombres a otro, o modificar la clase reference.cs generada por el proxy solo para reemplazarla la próxima vez que actualice la referencia web).

Aquí hay un (muy) buen tutorial sobre el tema:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx