9 de abril de 2010

HttpContext.Current: Obtener variables de Session en metodos Static

En esta ocasión quiero compartir una nota rápida, y es el uso de la propiedad Current de la clase HttpContext (HttpContext.Current).

HttpContext.Current: Obtiene o establece el objeto HttpContext de la solicitud HTTP actual.

Esta propiedad tiene muchos usos interesantes, pero quiero compartir uno que recientemente usé en un caso práctico. Así que como siempre paso a contar la problemática y colocarnos en contexto.

 

Ejemplo de uso de HttpContext.Current

Recientemente estaba modificando una página web; esta tenía una llamada Ajax a un WebMethod que se encontraba en la misma página. Dicho método era evidentemente estático, por lo que no se podía obtener de forma directa el valor de la variable de Session. Como se necesitaba poder leer la variable de Session, lo que se hizo inicialmente fue declarar una propiedad estática para su uso posterior, como se muestra en el código:

public partial class Page_Ajax_Test : Page
{
  public static string strUsuario = string.Empty;
 
  protected void Page_Load(object sender, EventArgs e)
  {
    strUsuario = Session["idUsuario"].ToString();
  }
 
  [WebMethod]
  public static bool RecuperarReserva(string datos)
  {
    string usuario = strUsuario;
    ... ...

Para la segunda y definitiva variante (más elegante) se usó la propiedad HttpContext.Current y así no tuvimos la necesidad de crear una variable estática a la página, el código quedó así:

public partial class Page_Ajax_Test: Page
{
  protected void Page_Load(object sender, EventArgs e) {}
 
  [WebMethod]
  public static bool RecuperarReserva(string datos)
  {
    int idUsuario;
    string usuario = HttpContext.Current.Session["idUsuario"].ToString();
 
    if (int.TryParse(usuario, out idUsuario))
      return DoSomething(idUsuario);
 
    return false;
  }

Esta propiedad HttpContext.Current tiene otros muchos usos prácticos, te invito a que dejes algún comentario sobre posibles usos.

 

Artículos relacionados:

11 comentarios:

  1. Hola, me parece totalmente inapropiado el uso del atributo "[WebMethod]" en un método publico estático de una clase "handler" de página (mejor cree un servicio web)! Ese método debería encontrarse en una librería de utilidades si es que necesita consumirlo en otros espacios de su aplicación! Por favor enseñemos buenas prácticas! Por otro lado, el uso de HttpContext.Current es totalmente correcto (esté o no en un contexto estático de la aplicación)! Las páginas web no deben procesar negocio, solamente hacer validaciones de datos, gestión de eventos, enlace de datos y gestión de la misma vista o presentación!! Nada de código de negocio! Saludos!

    ResponderEliminar
  2. Hola “Anónimo”:

    Estoy de acuerdo contigo (aunque no comparto el tono y lo categórico de tus afirmaciones), pero dejando de lado esto último, estoy 100% de acuerdo en que una buena estrategia sería la de usar un WebService; pero eso ya es Arquitectura de Software y este artículo no pretende, ni de cerca, abordar esa materia.

    El único objetivo que persigo con este espacio (Como su titulo indica) es el de dar a conocer el objeto HttpContext.Current. Y el usar el WebMethod es más cómodo para hacer pruebas.

    Por ejemplo, cuando quieres probar algo para entenderlo, por lo general te creas un proyecto simple de consola, aunque no pretendas usarlo en la práctica, pero es mucho más cómodo para comprenderlo ¿verdad?

    Creo además, que eso de “TOTALMENTE inapropiado” hummm …, esta característica desarrollada por Microsoft es bastante valida, y cómoda de usar, es solo cuestión de conocerla y usarla cuando se precise, y es que estoy pensando en aquello de:

    “Cuando tenemos un martillo, todo nos parece clavo.”

    Prefiero armar mi caja con todas las herramientas posibles y estar listo para cuando pueda precisarlas.

    Una última reflexión: Los programadores no siempre se encuentran con proyectos bien estructurados, ni tampoco tienen siempre la libertad de poder cambiar a su antojo, así q mejor saber el uso de todas las cosas.

    Pero me quedo con la idea positiva de tu comentario, y solo quiero reiterarte que estoy de acuerdo contigo, pero deberás entenderme que si para explicar el uso de HttpContext.Current tuviese que crearme un proyecto con la clase, crear además el servicio, exponerlo, bufff… , probablemente desviaríamos al lector de lo esencial de este pequeño tip. De todas formas me disculpo si he herido tu orgullo de arquitecto y para “compensarte”…. jejejeje te recomiendo este post http://blogs.msdn.com/cesardelatorre/archive/2010/03/26/our-brand-new-ddd-n-layer-net-4-0-architecture-guide-book-and-sample-app-in-codeplex.aspx de Cesar de la Torre, donde se trata a fondo la arquitectura n-capas orientada al dominio, sino lo has leído te resultará interesante.

    Salu2,
    Derbis

    ResponderEliminar
  3. Me parece un muy buen artículo, gracias al autor por publicarlo

    ResponderEliminar
  4. Hola derbis . .

    cual seria la diferncia entre el objeto HttpContext.Current.Session y el Page.Session

    ResponderEliminar
  5. DESARROLLAR EN .NET ES UNA MUY MALA PRACTICA!!! es por eso que salen estas alternativas de programación, yo desarrollo en JAVA y .NET y te puedo decir que un programador Java puede desarrollar con .net y no al reves!! creo que esto de desarrollar con WebMethod! fue un primer acercamiento al MVC que propone .NET aunque aun sigue siendo poco flexible!! en fin .... es un muy buen articulo saludos!

    ResponderEliminar
    Respuestas
    1. los javeros, creyendose que su lenguaje lo puede todo, hace bastante tiempo que C# dejo atras a Java, por mucho. Se que te duele, pero es la realidad.

      Eliminar
  6. Amigo muchas gracias!! me sirvió bastante

    ResponderEliminar
  7. te agradezco el aporte, me estaba quedando calvo ya que no encontraba la maldita solución, saludos

    ResponderEliminar
  8. Muy bueno el post, y coincido en que el objetivo esa mostrar el HttpContext.Current.Session....gracias

    ResponderEliminar
  9. Muy buen ejemplo, me sirvió de mucho.

    ResponderEliminar