martes, 24 de junio de 2008

Manejar estados en un WebService

Esto nos sirve para mantener valores entre las llamadas a los metodos , para esto contamos con dos formas de hacerlo Application o Session Objects.

Application Object :

Es usado para guardar un valor , que puede ser accedido por todas las sesiones que atienda nuestro WebService.
Por ejemplo , esto nos puede servir para llevar un contador de los metodos que son solicitados y este valor
va a poder ser visto desde cualquier WebMethod.Esto aplica a todos los metodos que NO tengan el atributo EnableSession=true
Dicho valor va a estar vivo dentro del servicio mientras que el IIS
(o en donde alojemos nuestro servicio) este levantado.


Ejemplo :


[WebMethod(Description="Ejemplo Application Object"]
public void InicializoApplicationObject()
{
Application["MiContador"] = 1;
}


Session Object :

En este caso el valor es especifico para cada usuario.Por ejemplo se puede usar para guardar el id del usuario.
Sin embargo para que un metodo pueda utilizar dicha valor debe definir el Atributo Enablesession en true
Al implementar session Objects nesesitamos definir cookies del lado del cliente para identificar la sesion
asociada con el estado de la session.estas cookies las debemos crear mediante codigo en el cliente.
Tener muy en cuenta este punto al pensar en implementar cookies.


Ejemplo :

[WebMethod(Description="Ejemplo session Object",EnableSession=true)]
public void InicializoSessionObject(string valor)
{
Session["UserId"] = 1;
}



A continuación les dejo un ejemplo un poco mas completo , en este caso utilizaremos Session Object.


Codigo WebService :


public class Service : System.Web.Services.WebService
{

// Asigno valor a mi variable de Session
[WebMethod(Description="Ejemplo session Object",EnableSession=true)]
public void InicializoSessionObject(string valor)
{
if (Session["MiVariableDeSesion"] == null)
{
Session.Add("MiVariableDeSesion", valor);
}
else
{
Session["MiVariableDeSesion"] = valor;
}
}

// Devuelvo valor de varible de session
[WebMethod(Description = "Ejemplo obtner valor de session Object", EnableSession = true)]
public string ValorSessionObject()
{
if (Session["MiVariableDeSesion"] == null)
return "Variable de Sesion sin Inicializar";

return (string)Session["MiVariableDeSesion"];
}


}


Codigo del cliente :

protected void Button1_Click(object sender, EventArgs e)
{
//Instancio el servicio
Service ws = new Service();

// Genero cookie
System.Net.CookieContainer cookie = new System.Net.CookieContainer();
ws.CookieContainer = cookie;

// Invoco metodo del WS
ws.InicializoSessionObject("Hola !");

// Asigno nuestra cookie con la variable de Session del WS
Session.Add("MiVariableDeSesion", cookie);

Label1.Text = "Valor de Session : " + ws.ValorSessionObject() ;

}

1 comentario:

0day dijo...

Etimado:

mi ejemplo es el siguiente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebServiceChat
{
[WebService(Namespace = "http://tempuri.org/",Name="Servicio Mensajeria")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// Para permitir que se llame a este servicio Web desde un script, usando ASP.NET AJAX, quite la marca de comentario de la línea siguiente.
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
[WebMethod(EnableSession=true)]
public void setMensaje(String msg)
{
this.Session["Mensaje"] = msg;
}
[WebMethod(EnableSession = true)]
public string getMensaje()
{
return (string)this.Session["Mensaje"];
}
}
}

y mi cliente , no me muestra la opcion de poder colocar session.add...

ayudame porfavor te dejo codigo cliente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Web;

namespace Clientt
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Cliente.ServicioMensajeriaSoapClient client = new Cliente.ServicioMensajeriaSoapClient();
System.Net.CookieContainer galleta = new System.Net.CookieContainer();
client.setMensaje("Mensaje");

MessageBox.Show(""+ client.getMensaje());

}
}
}