internal void SaveData(HttpContext context, LoginStatisticData data)
    {
      if (null == context)
        throw new ArgumentNullException("context");
      if (null == data)
        throw new ArgumentNullException("data");


      lock (lockObject)
      {
        string fileName = Statistic.GetStatisticsPath(context) + "Logins.xml";

        // At last, write the data back to the login statistics file and
        // put the data object back to the cache.
        try
        {
          data.WriteXml(fileName);
        }
        catch (UnauthorizedAccessException ex)
        {
          HandleNoAccessException(Statistic.GetStatisticsPath(context), ex);
        }
        catch (SecurityException ex)
        {
          HandleNoAccessException(Statistic.GetStatisticsPath(context), ex);
        }
        catch (Exception ex)
        {
          HandleException(Statistic.GetStatisticsPath(context), ex);
        }

        context.Cache.Insert("LoginStatisticData", data, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);
      }
    }
    public LoginStatisticData GetData(HttpContext context)
    {
      if (null == context)
        throw new ArgumentNullException("context");

      LoginStatisticData data = null;

      lock (lockObject)
      {
        string fileName = Statistic.GetStatisticsPath(context) + "Logins.xml";

        // Try to get the login statistics data from the cache.
        // If the data is not in the cache, try to load the file.
        // At last, if the file doesn't exist, create a new data object.
        object obj = context.Cache.Get("LoginStatisticData");
        if ((null != obj) && obj.GetType().Equals(typeof(LoginStatisticData)))
        {
          data = (LoginStatisticData)obj;
        }
        else if (File.Exists(fileName))
        {
          data = new LoginStatisticData();
          data.ReadXml(fileName);
        }
        else
        {
          data = new LoginStatisticData();
        }
      }

      return data;
    }