Para César de la Torre y el que me quiera ayudar

14/09/2004 - 18:36 por AOG | Informe spam
Hola, me dirijo a tí porque en su día me ayudades en una
cuestión parecido, no quita que el que lea esto y me
pueda echar una mano se lo agradecería mucho,pues llevo
mas de una semana y aún no he encontrado la solución.
Pero donde yo quería llegar es poder pasar y recibir
desde un formulario Windows un objeto de una clase
implementada por mí a un servicio web
lo que he hecho es:

Esta es la Clase que está en el proyecto Servicio Web:
Public Class MiColeccion
Public Col As New ArrayList
Public ColKey As New ArrayList

Public Sub Add(ByVal Ob As String, ByVal Key As
String)
Col.Add(Ob)
ColKey.Add(Key)
End Sub

Public Function Leer(ByVal Key As String) as Object
Dim i As integer
For i = 0 To ColKey.Count -1
If ColKey(i) = Key then
Return Col.Add(i)
End If
Next
End Function
End Class

En el Servicio Web:
<WebMethod()> Public Function Ejemplo(ByVal Col as
MiColeccion ) As MiColeccion
If Col.Count = 0 Then
Col.Add("Un Elemento", "Elemento1")
Else
Col.Add("Otro Elemento", "Elemento2"
End If
Return Col
End Sub

En el formulario Windows
Private Sub MiProcedimiento()
Dim oCo1 as MiServicio.MiColeccion
Dim oCo2 as MiServicio.MiColeccion
Dim Sw as MiServicio.Servicio1
oCol.Add("Un Elemento", "Elemento1")
oCo2=Sw.Ejemplo(oCol)
Msgbox oCo2.Lee("Elemento1")
End Sub

Nota: Es un ejemplo simple pero creo que se ve lo que
quiero hacer

Os comento: tengo un clase en el proyecto del Servicio
Web y un Metodo de Servicio, tengo un proyecto tipo
Windows From, lo que intento es que la aplicación de tipo
windows haga una llamada al metodo del servicio web,
hasta ahí bien, se hace una referencia al servicio web y
se llama a su metodo, el problema es que necesito recibir
y pasar como parámetro un objeto creado por mí que emula
a una coleccion, el problema es que lo unico que se ve en
el objeto desde el formulario son los dos arrays pero no
se ve el metodo Add ni Lee de mi clase:
Dim oCo1 as MiServicio.MiColeccion
oCo1.Col y oCo1.ColKey 'si se ve (accedo)
pero no puedo acceder a oCol.Add ni oCol.Lee, he
comporbado que solo se ven de los objetos que están en el
servicio web las propiedades, es decir, la variables
publicas declaradas en el objeto, pero no los
procedimientos o funciones.

Que es lo que tengo que hacer para que se pueda ver los
procedimientos y funciones de mi clase desde un
formulario de windows. Yo pienso que si se puede hacer,
he oido algo sebre serialización pero no se hacerlo en un
servicio web. Podría ponerme un ejemplo que funcione.
Un Saludo
 

Leer las respuestas

#1 CESAR DE LA TORRE [Microsoft MVP]
14/09/2004 - 21:58 | Informe spam
Vamos a ver, tienes que tener en cuenta que lo que se puede pasar como
parámetro en un WebService son solamente entre comillas "DATOS" (bien en
forma de variables, o en forma de objetos de clases) pero lo que pasas son
solamente datos que de forma persistente (serializados) se transmitan en
forma de XML. Hay que tener en cuenta que la filosofía de los WebServices
sigue el principio de 'acoplamiento debil', es decir, que sin 'conocer' (sin
tener una referencia de un tipo de clase o assembly) puedo invocar a un
WebService simplemente conociendo su 'interfaz' que de una forma
simplificada sería su clase PROXY (Esto en cambio no pasa con REMOTING o
DCOM donde necesariamente tienes que conocer los 'tipos' o clases que vas a
invocar remotamente).
Pero en cambio, en el caso de los parámetros de entrada o de salida de un
WebService, al final solamente pueden ser datos (serializados como XML de
una forma automatizada) o como mucho objetos serializados de clases cuyo
tipo 'conozcamos' en el otro extremo (este sería el caso de un DataSet),
pero lo que no se puede hacer es pasar implementación de métodos de objetos
(lógica de ejecución) por 'arte de magia', es decir, yo puedo implementar
una serialización de los datos y/o estados de un objeto, pero no puedo
serializar en forma de XML la lógica de ejecución de un objeto. Solamente
'funcionaría' en el caso de que dicho objeto ya lo 'conozca' en el otro
extremo cliente (como un DataSet u otro caso comparable).

Como moraleja, piensa en los parámetros de un WebService exclusivamente como
si fueran datos, toda la lógica de negocio (implementación de métodos) lo
normal es que sea ejecutada de forma remota por los propios WebMethods del
WebService, no por métodos aislados de un objeto que viaje al extremo
cliente.

Lo que tu quieres hacer es orientación a objetos pura, pero en este caso, no
se ajusta a la filosofía/tecnología de los WebServices. (al igual que un
WebService es STATE-LESS, cosa que no se ajusta a una OOP pura). Los
WebServices no buscan un purismo de OOP sino solucionar problemáticas de
aplicaciones distribuidas en entornos heterogéneos y utilziando estándares.

En cuanto a la serialización de objetos de clases 'custom' tuyas que tengan
cierta complejidad, tienes que implementar en tu clase el interfaz
ISerializable y encargarte tu de implementar la lógica que serialice tu
objeto (que se supone que tiene una estructura de datos compleja),
especialmente implementando el método 'GetObjectData()'. Pero recuerda que
solamente podrás serializar los datos y/o estados de tu objeto, no la lógica
de ejecución de tu clase que pases como parámetro.
En la siguiente URL tienes una introducción a la implementación del interfaz
ISerializable:
http://builder.com.com/5100-6386_14...isting%20A

Saludos,

César de la Torre
[Microsoft MVP - .NET XML WebServices]
[MCSE] [MCT]

Renacimiento
Microsoft GOLD Certified Partner
www.renacimiento.com



"AOG" wrote in message
news:0bc901c49a79$0da95ce0$
Hola, me dirijo a tí porque en su día me ayudades en una
cuestión parecido, no quita que el que lea esto y me
pueda echar una mano se lo agradecería mucho,pues llevo
mas de una semana y aún no he encontrado la solución.
Pero donde yo quería llegar es poder pasar y recibir
desde un formulario Windows un objeto de una clase
implementada por mí a un servicio web
lo que he hecho es:

Esta es la Clase que está en el proyecto Servicio Web:
Public Class MiColeccion
Public Col As New ArrayList
Public ColKey As New ArrayList

Public Sub Add(ByVal Ob As String, ByVal Key As
String)
Col.Add(Ob)
ColKey.Add(Key)
End Sub

Public Function Leer(ByVal Key As String) as Object
Dim i As integer
For i = 0 To ColKey.Count -1
If ColKey(i) = Key then
Return Col.Add(i)
End If
Next
End Function
End Class

En el Servicio Web:
<WebMethod()> Public Function Ejemplo(ByVal Col as
MiColeccion ) As MiColeccion
If Col.Count = 0 Then
Col.Add("Un Elemento", "Elemento1")
Else
Col.Add("Otro Elemento", "Elemento2"
End If
Return Col
End Sub

En el formulario Windows
Private Sub MiProcedimiento()
Dim oCo1 as MiServicio.MiColeccion
Dim oCo2 as MiServicio.MiColeccion
Dim Sw as MiServicio.Servicio1
oCol.Add("Un Elemento", "Elemento1")
oCo2=Sw.Ejemplo(oCol)
Msgbox oCo2.Lee("Elemento1")
End Sub

Nota: Es un ejemplo simple pero creo que se ve lo que
quiero hacer

Os comento: tengo un clase en el proyecto del Servicio
Web y un Metodo de Servicio, tengo un proyecto tipo
Windows From, lo que intento es que la aplicación de tipo
windows haga una llamada al metodo del servicio web,
hasta ahí bien, se hace una referencia al servicio web y
se llama a su metodo, el problema es que necesito recibir
y pasar como parámetro un objeto creado por mí que emula
a una coleccion, el problema es que lo unico que se ve en
el objeto desde el formulario son los dos arrays pero no
se ve el metodo Add ni Lee de mi clase:
Dim oCo1 as MiServicio.MiColeccion
oCo1.Col y oCo1.ColKey 'si se ve (accedo)
pero no puedo acceder a oCol.Add ni oCol.Lee, he
comporbado que solo se ven de los objetos que están en el
servicio web las propiedades, es decir, la variables
publicas declaradas en el objeto, pero no los
procedimientos o funciones.

Que es lo que tengo que hacer para que se pueda ver los
procedimientos y funciones de mi clase desde un
formulario de windows. Yo pienso que si se puede hacer,
he oido algo sebre serialización pero no se hacerlo en un
servicio web. Podría ponerme un ejemplo que funcione.
Un Saludo

Preguntas similares