¿Cómo utilizar las sesiones en una aplicación ASP.NET MVC 4?

Soy nuevo en ASP.NET MVC. He utilizado PHP antes y fue fácil crear una sesión y seleccionar los registros de los usuarios basados en las variables de la sesión actual.

He buscado por todas partes en Internet un sencillo tutorial paso a paso que pueda mostrarme cómo crear y utilizar sesiones en mi aplicación C# ASP.NET MVC 4. Quiero crear una sesión con variables de usuario a la que pueda acceder desde cualquier parte de mis controladores y poder utilizar las variables en mis consultas LINQ.

-¡Gracias de antemano!

Solución

Prueba con

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List;

//to clear the session value

Session["products"]=null;
Comentarios (9)

Debido a la naturaleza sin estado de la web, las sesiones son también una forma extremadamente útil de persistir objetos a través de las peticiones, serializándolos y almacenándolos en una sesión.

Un caso perfecto de uso de esto podría ser si necesitas acceder a información regular a través de tu aplicación, para ahorrar llamadas adicionales a la base de datos en cada solicitud, estos datos pueden ser almacenados en un objeto y des-serializados en cada solicitud, así:

Nuestro objeto reutilizable y serializable:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Caso de uso:

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

Una vez serializado este objeto, podemos utilizarlo en todos los controladores sin necesidad de volver a crearlo o consultar la base de datos para los datos que contiene.

Inyecta tu objeto de sesión usando Inyección de Dependencia.

En un mundo ideal, deberíamos 'programar a una interfaz, no a una implementación' e inyectar nuestro objeto de sesión serializable en nuestro controlador utilizando el contenedor de Inversión de Control de nuestra elección, de esta manera (este ejemplo utiliza StructureMap ya que es con el que estoy más familiarizado).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

A continuación, registraría esto en su archivo Global.asax.cs.

Para aquellos que no están familiarizados con la inyección de objetos de sesión, puede encontrar una entrada de blog más profunda sobre el tema aquí.

Unas palabras de advertencia:

Vale la pena señalar que las sesiones deben mantenerse al mínimo, las sesiones grandes pueden empezar a causar problemas de rendimiento.

También se recomienda no almacenar datos sensibles en ellas (contraseñas, etc.).

Comentarios (3)

Así es como funciona el estado de la sesión en ASP.NET y ASP.NET MVC:

Visión general del estado de sesión en ASP.NET

Básicamente, se hace esto para almacenar un valor en el objeto Session:

Session["FirstName"] = FirstNameTextBox.Text;

Para recuperar el valor:

var firstName = Session["FirstName"];
Comentarios (3)