/// <summary>
 /// This method is fired when an item is removed from the cache.  It is used to detect when a cache item
 /// expires, indicating that the session has expired, and fires the SessionEnd event.
 /// </summary>
 private void CacheItemRemovedCallbackMethod(string key, object value, CacheItemRemovedReason reason)
 {
     if (reason == CacheItemRemovedReason.Expired)
     {
         if (SessionEnd != null)
         {
             SessionEndedEventArgs e = new SessionEndedEventArgs(key, value);
             SessionEnd(this, e);
         }
     }
 }
        /// <summary>
        /// Fires the session end event and removes it from the
        /// application cache (so it doesnt fire again)
        /// </summary>
        public static void EndSession()
        {
            // Ensure we have a session key
            if (SessionObjectKey == null)
            {
                return;
            }

            // Ensure we have a HttpContext
            if (HttpContext.Current == null)
            {
                Debug.WriteLine("No current http context");
                return;
            }

            // Get the current session
            HttpSessionState currentSession = HttpContext.Current.Session;

            // Ensure we have a current session
            if (currentSession == null)
            {
                Debug.WriteLine("No current session");
                return;
            }

            if (SessionEnd != null)
            {
                string key   = currentSession.SessionID;
                object value = currentSession[SessionObjectKey];

                SessionEndedEventArgs e = new SessionEndedEventArgs(key, value);
                SessionEnd(null, e);
            }

            // Remove the session from the cache
            HttpContext.Current.Cache.Remove(currentSession.SessionID);
        }