2009-08-29 10 views
5

Me gustaría almacenar algunos objetos solo para una solicitud a través del estado de la sesión. No puedo pensar en una manera fácil de lograr esto. Esto es exactamente lo que hace el objeto TempData de ASP.NET MVC. ¿Podría alguien proporcionarme un enlace o algunos ejemplos de cómo tener un objeto en estado de sesión solo sobrevive a una solicitud adicional?Objeto similar a TempData en WebForms - Estado de sesión solo para 1 Solicitud adicional

Estaba pensando, esto podría lograrse haciendo un objeto de diccionario personalizado, que almacena una edad (número de solicitudes) en cada artículo. Al suscribirse a los métodos Application_BeginRequest y Application_EndRequest, puede realizar la limpieza requerida de los objetos. Esto incluso podría facilitar la creación de un objeto que almacenara un dato para solicitudes X, no solo uno. ¿Está en el camino correcto?

+0

El enfoque que describes es exactamente cómo lo habría implementado. – JoshJordan

+0

Bien, un problema con mi enfoque: el objeto Session es nulo en ambos métodos. ¿Alguien tiene una idea de dónde puedo guardar el código de limpieza? –

+0

Estoy sintiendo tu dolor. –

Respuesta

1

he implementado algo muy similar a lo que usted describe en el método de Application_AcquireRequestState Global.ascx.cs. Todos mis objetos de sesión están envueltos en una clase que cuenta el número de lecturas.

// clear any session vars that haven't been read in x requests 
List<string> keysToRemove = new List<string>(); 
for (int i = 0; HttpContext.Current.Session != null && i < HttpContext.Current.Session.Count; i++) 
{ 
    var sessionObject = HttpContext.Current.Session[i] as SessionHelper.SessionObject2; 
    string countKey = "ReadsFor_" + HttpContext.Current.Session.Keys[i]; 
    if (sessionObject != null/* && sessionObject.IsFlashSession*/) 
    { 
     if (HttpContext.Current.Session[countKey] != null) 
     { 
      if ((int)HttpContext.Current.Session[countKey] == sessionObject.Reads) 
      { 
       keysToRemove.Add(HttpContext.Current.Session.Keys[i]); 
       continue; 
      } 
     } 
     HttpContext.Current.Session[countKey] = sessionObject.Reads; 
    } 
    else if (HttpContext.Current.Session[countKey] != null) 
    { 
     HttpContext.Current.Session.Remove(countKey); 
    } 
} 

foreach (var sessionKey in keysToRemove) 
{ 
    string countKey = "ReadsFor_" + sessionKey; 
    HttpContext.Current.Session.Remove(sessionKey); 
    HttpContext.Current.Session.Remove(countKey); 
} 
+1

¿Cómo se ve 'SessionHelper.SessionObject2'? – mattalxndr

+1

-1 para código incompleto-¿qué es SessionObject2? – EdenMachine

Cuestiones relacionadas