2011-05-03 14 views
11

Tengo un sitio web con un objeto Cache personalizado dentro de una biblioteca de clases. Todos los proyectos ejecutan .NET 3.5. Me gustaría convertir esta clase para usar el estado de sesión en lugar de la caché, para preservar el estado en un servidor de estado cuando mi aplicación se recicla. Sin embargo, este código arroja una excepción con "HttpContext.Current.Session is null" cuando visito los métodos de mi archivo Global.asax. Llamo a la clase de esta manera:HttpContext.Current.Session es nulo

Customer customer = CustomerCache.Instance.GetCustomer(authTicket.UserData); 

¿Por qué el objeto siempre es nulo?

public class CustomerCache: System.Web.SessionState.IRequiresSessionState 
{ 
    private static CustomerCache m_instance; 

    private static Cache m_cache = HttpContext.Current.Cache; 

    private CustomerCache() 
    { 
    } 

    public static CustomerCache Instance 
    { 
     get 
     { 
      if (m_instance == null) 
       m_instance = new CustomerCache(); 

      return m_instance; 
     } 
    } 

    public void AddCustomer(string key, Customer customer) 
    { 
     HttpContext.Current.Session[key] = customer; 

     m_cache.Insert(key, customer, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0), CacheItemPriority.NotRemovable, null); 
    } 

    public Customer GetCustomer(string key) 
    { 
     object test = HttpContext.Current.Session[ key ]; 

     return m_cache[ key ] as Customer; 
    } 
} 

Como se puede ver que he intentado añadir IRequiresSessionState a la clase, pero eso no hace una diferencia.

Saludos Jens

+0

Si intenta acceder a la sesión desde Application_Start, todavía no hay una sesión en vivo. – onof

Respuesta

15

no es realmente acerca de la inclusión del Estado dentro de su clase, sino más bien en el que lo haga en su Global.asax. La sesión no está disponible en todos los métodos.

Un ejemplo de trabajo sería:

using System.Web.SessionState; 

// ... 

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState) 
     { 
      HttpContext context = HttpContext.Current; 
      // Your Methods 
     } 
    } 

No funcionará, por ejemplo, en Application_Start

+0

Lo llamo en vacío Application_AuthenticateRequest (remitente del objeto, EventArgs e), ¿eso es un no ir? –

+0

Sí, eso es un no ir, cuando se llama este método, la sesión siempre es nula, puedes probarla simplemente depurando y comprobando si 'Context.Handler' es' IRequiresSessionState' o 'IReadOnlySessionState', lo que nunca sucede. Sin embargo, en función de lo que he hecho, 'Application_PreRequestHandlerExecute' funciona para esto, aunque no estoy seguro de sus objetivos. –

0

Dependiendo de lo que estamos tratando de hacer, también puede beneficiarse del uso de Session_Start y Session_End en Global.asax:

http://msdn.microsoft.com/en-us/library/ms178473(v=vs.100).aspx

http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 

} 

void Session_End(object sender, EventArgs e) 
{ 
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode 
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised. 

} 

Nota las restricciones en modo SessionState antes de confiar en Session_End.