Cómo recuperar una variable de sesión en ASP.NET MVC C#

Si, es algo básico. Pero son estás pequeñas cosas las que me hacen perder unos preciosos minutos en encontrar cómo se hace.

En asp clásico, para leer las variables de servidor utilizaba un Request.ServerVariables. En cambio ahora es un poquito menos directo. Debiendo utilizar el contexto actual, desde el controlador..

[Actualización] 16.02.2016

Eduard Tomás ha escrito un excelente comentario a esta entrada en donde me hace dos recomendaciones importantes:

* Para recuperar la url a donde me estoy conectando mejor utilizar:

var sessionVar = ControllerContext.RequestContext.HttpContext.Request.ServerVariables[""];

En el caso específico que necesito, que es utilizar la URL actual para construir las direcciones de respuesta para las operaciones del TPV, ni tan siquiera necesito acceder a dichas variables de servidor.

var url = ControllerContext.RequestContext.HttpContext.Request.UrlReferrer;

Además me señala, con toda razón, que tengo un problema de diseño ya que quiero acceder al HttpContext desde fuera del Controller, por lo cual he cambiado el diseño del controlador de esta forma:

public ActionResult FichaTecnica(string idVehiculo)
{
    var vehiculo = new VehiculoEntity { RowKey = idVehiculo };
    var url = ControllerContext.RequestContext.HttpContext.Request.UrlReferrer;
    var viewmodel = new FichaTecnicaViewModel(vehiculo, url.ToString());

return View(viewmodel);
}

Espero que sea de utilidad y mil gracias a Eduard.

Anuncios

3 comentarios en “Cómo recuperar una variable de sesión en ASP.NET MVC C#

  1. Buenas!
    Evita en lo posible (¡siempre!) usar HttpContext.Current en una app MVC. Aunque MVC no está desacoplado de System.Web.dll se dieron algunos pasos para facilitar un cierto desacople.

    En su lugar usa este código:
    var referrer = ControllerContext.RequestContext.HttpContext.Request.UrlReferrer;

    Este código funciona SOLO dentro de un controlador, pero es que SOLO en los controladores tienes que tener código dependiente de http. Así que ya está bien que sea así. Por supuesto usar HttpContext.Current fuera de un controlador funciona en MVC pero es un error.
    La razón de que sea un error se puede ver con este código:

    var t1 = ControllerContext.RequestContext.HttpContext.GetType();
    var t2 = System.Web.HttpContext.Current.GetType();

    El primer tipo es el HttpContext que obtenemos a través de la propiedad ControllerContext del controlador y podemos ver que es “System.Web.HttpContextWrapper”
    El segundo tipo es el que obtenemos usando la propiedad estática Current de HttpContext y es “System.Web.HttpContext”

    La clase HttpContextWrapper es una clase que tiene LA MISMA interfaz que HttpContext pero… es mockeable. Es decir podemos crear mocks de HttpContextWrapper y por lo tanto probar nuestros controladores en un entorno de unit-testing o de integración donde NO hay pipeline de ASP.NET creado y por lo tanto HttpContext.Current vale null.

    Así que en resúmen… no uses HttpContext.Current nunca. Usa siempre ControllerContext. Y sí necesitas acceder a HttpContext.Current desde FUERA de un controlador… revisa tu diseño!

    Me gusta

  2. El motivo de esto es que tengo que declarar un parámetro con las URL a donde tiene que enviarme el TPV a la vuelta de una operación de pago. Voy a cambiar el diseño para enviarle al constructor del mensaje que envío a la TPV para enviarle la URL desde el controlador, como indicas.

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s