Usar variables de sesión en servicios web de WCF

Miércoles, 25 Feb, 2009 @ 20:47 | Por Gustavo Cantero (The Wolf) | ASP.NET, WCF

Muchas veces necesitamos guardar información sensible por cada sesión de usuario de una aplicación web, y muchas de esas veces decidimos guardarlas en variables de sesión, ya que son seguras y rápidas, aunque consumen recursos del servidor, pero con un uso medido son una buena solución.  El problema surge cuando estas variables deben ser utilizadas por servicios web de WCF (Windows Communication Foundation), y que al intentar acceder a ellas a través del objeto System.Web.HttpContext.Current.Session nos devuelve la clásica excepción Object reference not set to an instance of an object.  Esto es debido a que la propiedad Current del objeto HttpContext es nula.  La causa de este comportamiento es debido a que en el WCF se desacopló los servicios y sus operaciones de ASP.NET, ya que el transporte de éstos no tiene que ser necesariamente http.

Para poder acceder al contexto web desde un servicio de WCF hay que utilizar el atributo AspNetCompatibilityRequirements para especificar el modo de compatibilidad que va a tener con ASP.NET.  Por ejemplo, si tenemos un servicio llamado “ServiceTest”, y queremos que tenga acceso a las variables de sesión, el mismo debería quedar como esto:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : ITestService {
  //operaciones del servicio
}

Pero esto no es todo, todavía hay que escribir un poco más.  Hasta ahora marcamos a nuestro servicio como que “puede” utilizar la compatibilidad con ASP.NET, pero si en este punto consultamos la propiedad Current del HttpContext veremos que sigue siendo nula, y peor aún si en lugar de poner “Allowed” en el atributo de compatibilidad pusimos “Required”: se nos va a generar una excepción.  Esto es causado porque aún falta configurar la aplicación para utilizar la compatibilidad con ASP.NET.  Para que los servicios web puedan utilizar esta característica hay que modificar el web.config agregando (o modificando) la siguiente línea dentro de <configuration><system.serviceModel>:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

Una vez hecho esto ya deberíamos poder acceder a nuestras variables de sesión con un código parecido al siguiente:

object sessionVar = System.Web.HttpContext.Current.Session["MiVariable"];
VN:F [1.7.3_972]
Rating: 8.5/10 (4 votos cast)

Reciente

  • Cómo firmar un documento PDF desde C# con iTextSharp
  • Obtener lista de contactos de Gmail
  • Pósters de tecnologías y productos de Microsoft
  • Parámetros opcionales en C# 4.0
  • Enlace via código de grillas en ASP.NET
  • Poster con las clases de .NET Framework 4.0
  • Especificación de los lenguajes C# 4.0 y Visual Basic 10.0
  • Tamaño de los parámetros en string.Format
  • 101 ejemplos de Visual C# 2010 y Visual Basic 2010
  • Enlace de elementos en controles de lista en ASP.NET
  •  

    Una Respuesta a “Usar variables de sesión en servicios web de WCF”

      AOG AOG dijo:

      Muy Bueno. Son pequeñas cosas que están en la msdn, pero que hay que buscarlas, y en sitios como este las encuentra más rápidamente,
      Un saludo

      VA:F [1.7.3_972]
      Rating: 0.0/5 (0 votos cast)

    Responder

    XHTML: Puede utilizar estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>