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

Resuelto Thuto Paul Gaotingwe asked hace 11 años • 5 respuestas

Soy nuevo en ASP.NET MVC. He usado PHP antes y fue fácil crear una sesión y seleccionar registros de usuario según las variables de la sesión actual.

He buscado en Internet un tutorial sencillo 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 las que pueda acceder desde cualquier lugar de mis controladores y poder usar las variables en mis consultas LINQ.

Thuto Paul Gaotingwe avatar Jan 03 '13 19:01 Thuto Paul Gaotingwe
Aceptado

Intentar

//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<Product>;

//to clear the session value

Session["products"]=null;
Jobert Enamno avatar Jan 03 '2013 12:01 Jobert Enamno

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

Un caso de uso perfecto de esto podría ser si necesita acceder a información regular en su aplicación, para guardar llamadas adicionales a la base de datos en cada solicitud, estos datos se pueden almacenar en un objeto y no serializarse 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 que este objeto se ha serializado, podemos usarlo en todos los controladores sin necesidad de crearlo o consultar la base de datos para obtener los datos que contiene nuevamente.

Inyecte su objeto de sesión usando la inyección de dependencia

En un mundo ideal, usted ' programaría en una interfaz, no en una implementación ' e inyectaría su objeto de sesión serializable en su controlador usando el contenedor de Inversión de Control de su elección, así (este ejemplo usa StructureMap ya que es con el que estoy más familiarizado ).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserProfileSessionData>().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;
    }
}

Luego registrará esto en su Global.asax.csexpediente.

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

Una palabra de advertencia:

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

También se recomienda no almacenar en ellos ningún dato sensible (contraseñas, etc).

Joseph Woodward avatar Dec 20 '2013 11:12 Joseph Woodward