Variables Globales Web Service

17/08/2005 - 12:40 por Alamo | Informe spam
Buenas a todos.

La verdad es que soy totalmente nuevo en este mundo del web service, y por
ello os planteo mi duda a ver si me pueden ayudar.

Tengo un Web Service con una serie de métodos públicos a través de los
cuales mediante su lista de parámetros, valido los datos enviados por los
clientes.

La duda: "pues me gustaría poder utilizar las variables globales que exísten
en la clase del web service para cada sesión de usuario y almacenar los
datos envíados por los cliente a los métodos públicos, sin necesidad de
tener que almacenar la información en una base de datos o en un archivo."

Creo que mi duda es por desconocer el funcionamiento interno de un Web
Service. Y es que he realizado pruebas de forma que los datos que se envían
a través del cliente hacia el web service se almacenen en variables
globlales, pero luego cuando llamo al método de consulta de dichas variables
estas están vacías. Creo que para cada llamada de método desde un cliente
hacia el web service, se libera toda la memoria asignada a dicha conexión
tras la ejecución del método.

Es mas, en la clase del web service he puesto públicas no solo variables,
sino también propiedades, y cuando en el código cliente accedo a dicho web
service no aparecen ni las propiedades ni las variables globales.

Espero haberme explicado con claridad,

saludos y gracias,

Álamo.

Preguntas similare

Leer las respuestas

#1 Ronald Ricardo Ramirez Moran
18/08/2005 - 01:59 | Informe spam
Hola como estas,

Bueno es para mi un gusto responderte esta GRAN pregunta que tenemos cuando
empezamos a conocer los Servicios Web.

Los servicios web pueden permitir el uso de Sesiones, ya que se encuentra
fuertemente vinculado a ASP.NET, en forma predeterminada los Servicios web no
tienen activada la caracteristica del uso de sesiones, ya que por seguridad,
han sido inhabilitadas, y exclusivamente se activarian en los Servicios web
que lo requieran, ahora, como lo activas?, puedes activarlo con:

[ WebMethod(EnableSession=true) ]

esto le dice al servicio web que se encuentra activo el uso de sessiones y
por lo tanto podras interconectarte con los diversos metodos en cualquier
momento con los objetos de coleccion Application y Session.

Podras encontrar mas informacion sobre ello en:

Administrar el estado en servicios Web XML creados mediante ASP.NET
http://msdn.microsoft.com/library/S...rvices.asp

Programming .NET Web Services Chapter 2
http://www.oreilly.com/catalog/prog.../ch02.html

WebMethodAttribute.EnableSession (Propiedad)
http://msdn.microsoft.com/library/S...nTopic.asp

HOW TO: Use CookieContainer to Maintain a State in Web Services When You Use
Visual C# .NET
http://support.microsoft.com/kb/816637/es

Saludos cordiales,

Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer
FoxEcuador Regional Coordinator

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk


"Alamo" escribió:

Mostrar la cita
#2 Alamo
18/08/2005 - 13:38 | Informe spam
Hola Ronald.

Gracias por contestar.

Sabía de la existencia de dicho método, pero pensaba que era posible
utilizar las propiedades y variables públicas de la clase a la que
perternece el servicio web, pero veo que no es posible.

Bueno en cuanto al uso del objeto session, me he puesto manos a la obra,
pero tengo ahora el siguiente problema:

Desde la depuración local desde mi entorno de desarrollo, las variables
session creadas, mantienen su contenido y la sesión parece ser la misma,
pero
cuando realizo una prueba con un formulario de cliente web service .net,
declarando e instanciando una variable que apunta al web service, cada vez
que lanzo un método público del servicio web, las variables session son
creadas y nunca se mantienen su contenido.

¿Por que puede ser?.

He depurado y consultado en mi aplicación cliente el objeto sessión, y su id
de sesión es diferente cada vez que lanzo a algún método del servicio web.
¿Por que?. como hago para que cada vez que lanze un método la sesión sea la
misma.

Saludos y Gracias,

Álamo.



"Ronald Ricardo Ramirez Moran" escribió en el
mensaje news:
Mostrar la cita
#3 Ronald Ricardo Ramirez Moran
26/08/2005 - 01:30 | Informe spam
Ok, creo saber cual es tu problema,

es posible que al llamar al servicio web lo hagas de la siguiente manera:

[C#]
void btnSetButton_Click(Object Src, EventArgs E)
{
MyService mv = new MyService();
mv.SetTextSession("Hola");
}

void btnGetButton_Click(Object Src, EventArgs E)
{
MyService mv = new MyService();
myLabel.Text = mv.GetTextSession();
}

[Vb.NET]
Public Sub btnSetButton_Click(src As Object, E As EventArgs)
Dim mv As new MyService()
mv.SetTextSession("Hola")
End Sub

Public Sub btnGetButton_Click(src As Object, E As EventArgs)
Dim mv As new MyService()
myLabel.Text = mv.GetTextSession()
End Sub


Una breve explicacion sobre el ejemplo anterior:
Mi servicio web almacena dentro de objetos de sesion un texto que asigno con
el Metodo Web "SetTextSession", luego accedo a al texto asignado con el
metodo "GetTextSession". Hasta ahi todo bien, se hace la llamada al servicio
desde 2 botones, uno asignando y otro obteniendo, el principal problema a
esto es que en verdad asigna la informacion, pero al tratar obtenerla no lo
hace.
Para arreglar esto, lo que debes hacer es Inicializar previamente el
servicio, esto te permitira mantener una sola ID de Sesion en cada llamada
hacia algun Metodo del Servicio. Por Ejemplo:



[C#]
public MyService mv;

private void Page_Load(Object sender ,EventArgs e)
{
// Evito que se cree un objeto nuevo en cada roundtrip
if(!IsPostBack)
mv = new MyService();


}

void btnSetButton_Click(Object Src, EventArgs E)
{
mv.SetTextSession("Hola");
}

void btnGetButton_Click(Object Src, EventArgs E)
{
myLabel.Text = mv.GetTextSession();
}

[Vb.NET]
Public mv As MyService();

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' Evito que se cree un objeto nuevo en cada roundtrip
if(!IsPostBack) Then mv = new MyService()
End Sub
Public Sub btnSetButton_Click(src As Object, E As EventArgs)
mv.SetTextSession("Hola")
End Sub

Public Sub btnGetButton_Click(src As Object, E As EventArgs)
myLabel.Text = mv.GetTextSession()
End Sub

Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer
FoxEcuador Regional Coordinator

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk


"Alamo" wrote:

Mostrar la cita
#4 Ronald Ricardo Ramirez Moran
26/08/2005 - 01:37 | Informe spam
Disculpa, en el mensaje anterior no logre explicarte porque no devuelve nada.

Es muy simple, esto es debido a que cada vez que creas una nueva instancia
del servicio web, este crea una nueva ID de Session, lo que a su vez hace que
te devuelva valores nulos, pues a la verdad nunca asignaste valores a las
variables pertenecientes a esta sesion, porque se encontraban en otra
Session, esto hace que cada Session sea individual, e independiente.

Saludos,
Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer
FoxEcuador Regional Coordinator

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk


"Ronald Ricardo Ramirez Moran" wrote:

Mostrar la cita
#5 CESAR DE LA TORRE [MVP]
06/10/2005 - 17:17 | Informe spam
Esto es así por diseño. Los Servicios Web son STATELESS, es decir, no guardan
estados y porque HTTP es un protocolo NO orientado a conexión.
Cada vez que llamas a un método desde la App Cliente, es como si se
volviera a crear el objeto en el servidor.

Para gestionar estados con los WebServices, las opciones mas utilziadas son:
- Sesiones de ASP.NET
- Persistencia en Bases de Datos como SQL Server
CESAR DE LA TORRE
Software Architect
[Microsoft MVP - XML Web Services]
[MCSE] [MCT]

Renacimiento
[Microsoft GOLD Certified Partner]


"Alamo" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida