Invocar Web Services

07/04/2005 - 23:05 por Ana | Informe spam
Tengo un problema con la invocacion de un metodo de un
servicio web:
1-Agrege una referencia web del servicio web a mi proyecto
2-En mi proyecto agregue lo siguiente e invoco al metodo
pasandole un parametro de tipo system.io.stream:

string url = Server.MapPath("")+"..\\Publico\\xml.xml";
System.IO.StreamReader data = new StreamReader(url);
System.IO.Stream tmp;
tmp = data.BaseStream;
Servicio.Recepcion proxy = new Servicio.Recepcion();
proxy.Recepcion_Pedidos(tmp );<error sale aqui
3-Al compilar me sale un error en la ultima linea y dice
que "no se puede convertir un tipo System.IO.Stream a
Servicio.Stream porque Servicio.Stream es una clase
Abstract" y como es abstracta tampoco puedo crear una
referencia a un objeto.
Mi metodo WebService tiene el metodo Recepcion_Pedidos que
recibe un parametro System.IO.Stream y cuando lo invoco
de otro proyecto el parametro de entrada se vuelve
Servicio.Stream .
ALguien me puede ayudar a entender esto y darme la
solucion a mi problema.
Gracias

Preguntas similare

Leer las respuestas

#1 A.Poblacion
08/04/2005 - 07:50 | Informe spam
No puedes pasarle un Stream a un servicio web. El stream está conectado a
algún dispositivo de entrada salida, por ejemplo, a un archivo si es un
FileStream. La máquina en donde se ejecuta el servicio web lógicamente no
tiene acceso al archivo que hay en la máquina llamante, y no tiene sentido
que reciba un Stream.

En general, cuando le pasas un argumento al servicio web, el argumento tiene
que serializarse (convertirse en una cadena de caracteres) para poderlo
transmitir por la linea. Eso implica que no podrás pasar aquello que no sea
posible serializar.

Si no tienes más remedio que usar el stream desde la máquina remota,
entonces en lugar de un servicio web puedes hacer la llamada mediante
Remoting. Remoting sí que permite pasar un proxy a una clase local (heredada
de MarshalByRefObject), de forma que cuando la máquina remota llama a
métodos de esa clase, los métodos se ejecutan en la máquina llamante. Con un
mecanismo de este tipo sí que podrías manipular el Stream local desde la
máquina remota. Pero en Web Services no existe este mecanismo.

"Ana" wrote in message
news:03ed01c53bb5$7b9f8b60$
Tengo un problema con la invocacion de un metodo de un
servicio web:
1-Agrege una referencia web del servicio web a mi proyecto
2-En mi proyecto agregue lo siguiente e invoco al metodo
pasandole un parametro de tipo system.io.stream:

string url = Server.MapPath("")+"..\\Publico\\xml.xml";
System.IO.StreamReader data = new StreamReader(url);
System.IO.Stream tmp;
tmp = data.BaseStream;
Servicio.Recepcion proxy = new Servicio.Recepcion();
proxy.Recepcion_Pedidos(tmp );<error sale aqui
3-Al compilar me sale un error en la ultima linea y dice
que "no se puede convertir un tipo System.IO.Stream a
Servicio.Stream porque Servicio.Stream es una clase
Abstract" y como es abstracta tampoco puedo crear una
referencia a un objeto.
Mi metodo WebService tiene el metodo Recepcion_Pedidos que
recibe un parametro System.IO.Stream y cuando lo invoco
de otro proyecto el parametro de entrada se vuelve
Servicio.Stream .
ALguien me puede ayudar a entender esto y darme la
solucion a mi problema.
Gracias

Respuesta Responder a este mensaje
#2 Ana
08/04/2005 - 16:35 | Informe spam
Hola, tu respuesta me sirvio de mucho y me ayudo a
entender mi error.
Quiero preguntarte algo mas si logro serializar el
archivo que leeo(archivo XML) y con la serializacion de
ese archivo se convierte en una gran cadena de caracteres
y esa cadena de caracteres se la envio al WebServices y en
el webservice la deserializo entonces el tipo de
parametro que recibe mi webservices es de tipo STRING eso
es correcto? o es de otro tipo? ?
Porque necesariamente tengo que enviarle al web services
el archivo XML ya que se requiere muchos datos para que el
servicio lo procese.
Escribe. Gracias.

No puedes pasarle un Stream a un servicio web. El stream


está conectado a
algún dispositivo de entrada salida, por ejemplo, a un


archivo si es un
FileStream. La máquina en donde se ejecuta el servicio


web lógicamente no
tiene acceso al archivo que hay en la máquina llamante, y


no tiene sentido
que reciba un Stream.

En general, cuando le pasas un argumento al servicio web,


el argumento tiene
que serializarse (convertirse en una cadena de


caracteres) para poderlo
transmitir por la linea. Eso implica que no podrás pasar


aquello que no sea
posible serializar.

Si no tienes más remedio que usar el stream desde la


máquina remota,
entonces en lugar de un servicio web puedes hacer la


llamada mediante
Remoting. Remoting sí que permite pasar un proxy a una


clase local (heredada
de MarshalByRefObject), de forma que cuando la máquina


remota llama a
métodos de esa clase, los métodos se ejecutan en la


máquina llamante. Con un
mecanismo de este tipo sí que podrías manipular el Stream


local desde la
máquina remota. Pero en Web Services no existe este


mecanismo.

"Ana" wrote in


message
news:03ed01c53bb5$7b9f8b60$
Tengo un problema con la invocacion de un metodo de un
servicio web:
1-Agrege una referencia web del servicio web a mi




proyecto
2-En mi proyecto agregue lo siguiente e invoco al metodo
pasandole un parametro de tipo system.io.stream:

string url = Server.MapPath("")




+"..\\Publico\\xml.xml";
System.IO.StreamReader data = new StreamReader(url);
System.IO.Stream tmp;
tmp = data.BaseStream;
Servicio.Recepcion proxy = new Servicio.Recepcion();
proxy.Recepcion_Pedidos(tmp );<error sale aqui
3-Al compilar me sale un error en la ultima linea y dice
que "no se puede convertir un tipo System.IO.Stream a
Servicio.Stream porque Servicio.Stream es una clase
Abstract" y como es abstracta tampoco puedo crear una
referencia a un objeto.
Mi metodo WebService tiene el metodo Recepcion_Pedidos




que
recibe un parametro System.IO.Stream y cuando lo invoco
de otro proyecto el parametro de entrada se vuelve
Servicio.Stream .
ALguien me puede ayudar a entender esto y darme la
solucion a mi problema.
Gracias





.

Respuesta Responder a este mensaje
#3 A.Poblacion
08/04/2005 - 16:58 | Informe spam
Sí, efectivamente podrías serializar el archivo xml y mandárselo al servicio
web, pero no es necesario. Basta con que cargues el contenido del archivo
dentro de un string (por ejemplo, con un ReadToEnd()), y le envíes el string
al servicio web (obviamente el proxy del servicio web ya sabe serializar el
string). De esta forma no hace falta que te preocupes para nada del proceso
de serialización.

"Ana" wrote in message
news:07ec01c53c48$2e3feb60$
Hola, tu respuesta me sirvio de mucho y me ayudo a
entender mi error.
Quiero preguntarte algo mas si logro serializar el
archivo que leeo(archivo XML) y con la serializacion de
ese archivo se convierte en una gran cadena de caracteres
y esa cadena de caracteres se la envio al WebServices y en
el webservice la deserializo entonces el tipo de
parametro que recibe mi webservices es de tipo STRING eso
es correcto? o es de otro tipo? ?
Porque necesariamente tengo que enviarle al web services
el archivo XML ya que se requiere muchos datos para que el
servicio lo procese.
Escribe. Gracias.

No puedes pasarle un Stream a un servicio web. El stream


está conectado a
algún dispositivo de entrada salida, por ejemplo, a un


archivo si es un
FileStream. La máquina en donde se ejecuta el servicio


web lógicamente no
tiene acceso al archivo que hay en la máquina llamante, y


no tiene sentido
que reciba un Stream.

En general, cuando le pasas un argumento al servicio web,


el argumento tiene
que serializarse (convertirse en una cadena de


caracteres) para poderlo
transmitir por la linea. Eso implica que no podrás pasar


aquello que no sea
posible serializar.

Si no tienes más remedio que usar el stream desde la


máquina remota,
entonces en lugar de un servicio web puedes hacer la


llamada mediante
Remoting. Remoting sí que permite pasar un proxy a una


clase local (heredada
de MarshalByRefObject), de forma que cuando la máquina


remota llama a
métodos de esa clase, los métodos se ejecutan en la


máquina llamante. Con un
mecanismo de este tipo sí que podrías manipular el Stream


local desde la
máquina remota. Pero en Web Services no existe este


mecanismo.

"Ana" wrote in


message
news:03ed01c53bb5$7b9f8b60$
Tengo un problema con la invocacion de un metodo de un
servicio web:
1-Agrege una referencia web del servicio web a mi




proyecto
2-En mi proyecto agregue lo siguiente e invoco al metodo
pasandole un parametro de tipo system.io.stream:

string url = Server.MapPath("")




+"..\\Publico\\xml.xml";
System.IO.StreamReader data = new StreamReader(url);
System.IO.Stream tmp;
tmp = data.BaseStream;
Servicio.Recepcion proxy = new Servicio.Recepcion();
proxy.Recepcion_Pedidos(tmp );<error sale aqui
3-Al compilar me sale un error en la ultima linea y dice
que "no se puede convertir un tipo System.IO.Stream a
Servicio.Stream porque Servicio.Stream es una clase
Abstract" y como es abstracta tampoco puedo crear una
referencia a un objeto.
Mi metodo WebService tiene el metodo Recepcion_Pedidos




que
recibe un parametro System.IO.Stream y cuando lo invoco
de otro proyecto el parametro de entrada se vuelve
Servicio.Stream .
ALguien me puede ayudar a entender esto y darme la
solucion a mi problema.
Gracias





.

Respuesta Responder a este mensaje
#4 Ana
09/04/2005 - 04:09 | Informe spam
Hola!
No quiero caer pesada.
Quiero hacerte una pregunta.

He visto un web service que tiene una linea de este tipo:
Dim Stream As New StreamReader(Request.InputStream)
y me dijeron que era un web services que escuchaba y lo
escuchado lo procesaba. Me puedes ayudar a entender. No me
explico como envian los datos?. Request.InputStream es
solo un tipo System.IO.Stream.
Ademas esta linea esta en un formulario(WebForm) y justo
en el Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs).
Luego ese stream es convertido a xml y procesado.


Sí, efectivamente podrías serializar el archivo xml y


mandárselo al servicio
web, pero no es necesario. Basta con que cargues el


contenido del archivo
dentro de un string (por ejemplo, con un ReadToEnd()), y


le envíes el string
al servicio web (obviamente el proxy del servicio web ya


sabe serializar el
string). De esta forma no hace falta que te preocupes


para nada del proceso
de serialización.

"Ana" wrote in


message
news:07ec01c53c48$2e3feb60$
Hola, tu respuesta me sirvio de mucho y me ayudo a
entender mi error.
Quiero preguntarte algo mas si logro serializar el
archivo que leeo(archivo XML) y con la serializacion de
ese archivo se convierte en una gran cadena de caracteres
y esa cadena de caracteres se la envio al WebServices y en
el webservice la deserializo entonces el tipo de
parametro que recibe mi webservices es de tipo STRING eso
es correcto? o es de otro tipo? ?
Porque necesariamente tengo que enviarle al web services
el archivo XML ya que se requiere muchos datos para que el
servicio lo procese.
Escribe. Gracias.

No puedes pasarle un Stream a un servicio web. El stream


está conectado a
algún dispositivo de entrada salida, por ejemplo, a un


archivo si es un
FileStream. La máquina en donde se ejecuta el servicio


web lógicamente no
tiene acceso al archivo que hay en la máquina llamante, y


no tiene sentido
que reciba un Stream.

En general, cuando le pasas un argumento al servicio web,


el argumento tiene
que serializarse (convertirse en una cadena de


caracteres) para poderlo
transmitir por la linea. Eso implica que no podrás pasar


aquello que no sea
posible serializar.

Si no tienes más remedio que usar el stream desde la


máquina remota,
entonces en lugar de un servicio web puedes hacer la


llamada mediante
Remoting. Remoting sí que permite pasar un proxy a una


clase local (heredada
de MarshalByRefObject), de forma que cuando la máquina


remota llama a
métodos de esa clase, los métodos se ejecutan en la


máquina llamante. Con un
mecanismo de este tipo sí que podrías manipular el Stream


local desde la
máquina remota. Pero en Web Services no existe este


mecanismo.

"Ana" wrote in


message
news:03ed01c53bb5$7b9f8b60$
Tengo un problema con la invocacion de un metodo de un
servicio web:
1-Agrege una referencia web del servicio web a mi




proyecto
2-En mi proyecto agregue lo siguiente e invoco al






metodo
pasandole un parametro de tipo system.io.stream:

string url = Server.MapPath("")




+"..\\Publico\\xml.xml";
System.IO.StreamReader data = new StreamReader(url);
System.IO.Stream tmp;
tmp = data.BaseStream;
Servicio.Recepcion proxy = new Servicio.Recepcion();
proxy.Recepcion_Pedidos(tmp );<error sale aqui
3-Al compilar me sale un error en la ultima linea y






dice
que "no se puede convertir un tipo System.IO.Stream a
Servicio.Stream porque Servicio.Stream es una clase
Abstract" y como es abstracta tampoco puedo crear una
referencia a un objeto.
Mi metodo WebService tiene el metodo Recepcion_Pedidos




que
recibe un parametro System.IO.Stream y cuando lo






invoco
de otro proyecto el parametro de entrada se vuelve
Servicio.Stream .
ALguien me puede ayudar a entender esto y darme la
solucion a mi problema.
Gracias





.





.

Respuesta Responder a este mensaje
#5 A.Poblacion
09/04/2005 - 10:06 | Informe spam
"Ana" wrote in message
news:0b1701c53ca9$247823c0$
He visto un web service que tiene una linea de este tipo:
Dim Stream As New StreamReader(Request.InputStream)
y me dijeron que era un web services que escuchaba y lo
escuchado lo procesaba.



Esa linea lo que hace es conectarte con una variable tuya el Stream que trae
los datos desde la máquina remota. Normalmente no lo procesarías
directamente, sino que dejarías que la funcionalidad interna de asp.net se
encargase de analizar los datos, pero si deseas procesarlos manualmente,
puedes interceptarlos con esa técnica. Digamos que esa sería una posible
forma de hacer "a mano" un web service, en lugar de usar la funcionalidad ya
existente de asp.net para crearlos.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida