Devolver un objeto en un metodo de un WS

08/05/2006 - 02:36 por Diego | Informe spam
Estoy desarrollando un WS y necesito que una de sus funciones (o métodos)
devuelva una instancia de una clase que contiene propiedades y métodos cuyos
tipos de datos NO son todos primitivos.
Para ello, en el código del metodo web instanció la clase en cuestión
creando un objeto y hago que la funcion devuelva este objeto. Por supuesto
que el tipo de dato de la función es el mismo que el del objeto.
Sin embargo, al examinar el WSDL o al consumir el servicio desde un cliente,
el objeto que se obtiene solo tiene propiedades con tipos de datos primitivos
y NINGUNO de sus métodos, aun si el método devuelve un dato primitivo.

Por ejemplo: Supongamos que la clase se llama Talles, tiene su constructor y
un metodo llamado "Actualizar()" que devuelve boolean.

En el WS creo una instancia de la clase llamada oTalles y el metodo web
devuelve tipo Talles quedando algo asi:

<WebMethod()> _

Public Function wmTalle() As Talles

Dim oTalles As New Talles

Return oTalles

End Function

Sin embargo en el cliente que lo consume genera un objeto sin sus metodos y
solo algunas propiedades.

Dim miTalles as New Talles = servicios.wmTalle()

¿Que debo hacer para solucionar este problema?
Gracias
 

Leer las respuestas

#1 CESAR DE LA TORRE [MVP]
11/05/2006 - 17:58 | Informe spam
Hola Diego.
Tienes un error de concepto. Los XML-WebServices solamente pueden devolver
objetos de tipo 'datos' o 'entidad' o como quieras llamarlos, pero solamente
de datos y además tienen que ser clases/datos serializables (Como un DataSet
o un DataTable, o una clase tuya custom serializable a XML).
Por lo tanto, es lógico que no veas los métodos del objeto que devuelve el
WebMethod. Es algo que NO se puede hacer con WebServices.
Digamos que todos los objetos de Negocio (con ejecución de métodos) tienen
que estar en el Servidor y ser ejecutados a través de los WebMethods.
También, lógicamente y debido a la serialización a XML e invocaciones
remotas, los parámetros son pasados siempre 'por valor' y NO 'por referencia'.

Además de eso (y al margen de lo que preguntas), ten en cuenta también que
los WebServices son STATE-LESS, es decir, que al llamar al WebService, si
inicializas una variable-miembro de la clase del WebService, al llamar a
continuación a otro WebMethod, dicho valor en la variable miembro habrá
desaparecido, porque de hecho en el servidor (de forma transparente) se ha
vuelto a crear el objeto WebService cada vez que haces una llamada a un
WebMethod.

Por último, para implementar clases custom serializables, normalmente se
hace con los atributos del tipo:
- XmlElementAttribute, XmlAttributeAttribute, XmlTextAttribute,
XmlArrayAttribute

Te mando una URL donde puede ver un ejemplo completo de Serialización de
clases custom (tus clases) en WebServices. No empieza en el principio del
artículo, está a partir del título que pone "Serializing Custom Classes":

http://www.dotnetjunkies.com/Tutori...D60B1.dcik

Pero recuerda que lo que devuelven los WebServices (aunque sean a partir de
objetos de Clases) son en definitiva solamente DATOS, no objetos con sus
métodos para ejecución.
CESAR DE LA TORRE
Software Architect
[Microsoft MVP - Connected Systems]
[MCSE] [MCT]

Renacimiento
[Microsoft GOLD Certified Partner]


"Diego" escribió:

Estoy desarrollando un WS y necesito que una de sus funciones (o métodos)
devuelva una instancia de una clase que contiene propiedades y métodos cuyos
tipos de datos NO son todos primitivos.
Para ello, en el código del metodo web instanció la clase en cuestión
creando un objeto y hago que la funcion devuelva este objeto. Por supuesto
que el tipo de dato de la función es el mismo que el del objeto.
Sin embargo, al examinar el WSDL o al consumir el servicio desde un cliente,
el objeto que se obtiene solo tiene propiedades con tipos de datos primitivos
y NINGUNO de sus métodos, aun si el método devuelve un dato primitivo.

Por ejemplo: Supongamos que la clase se llama Talles, tiene su constructor y
un metodo llamado "Actualizar()" que devuelve boolean.

En el WS creo una instancia de la clase llamada oTalles y el metodo web
devuelve tipo Talles quedando algo asi:

<WebMethod()> _

Public Function wmTalle() As Talles

Dim oTalles As New Talles

Return oTalles

End Function

Sin embargo en el cliente que lo consume genera un objeto sin sus metodos y
solo algunas propiedades.

Dim miTalles as New Talles = servicios.wmTalle()

¿Que debo hacer para solucionar este problema?
Gracias

Preguntas similares