BLUE.NET

-------- 众里寻她千百度

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1. *   
  2.   
  3.  * 使用说明:1. 在Application_Start()中启动定时器(定时清空错误信息):ErrorManager.Instance.Start(),   
  4.   
  5.  *              默认12小时运行一次,或用ErrorManager.Instance.SetTimerInterval()设置。   
  6.   
  7.  *           2. 在Application_Error()中,当发生错误时,保存这个错误信息并转到error.aspx中显示这个错误   
  8.   
  9.  *               string key = ErrorManager.Instance.AddError();   
  10.   
  11.  *               Response.Redirect("error.aspx?key=" + key);   
  12.   
  13.  *           3. 在error.aspx中通过url传来的key,取得并显示错误信息:   
  14.   
  15.  *               string err = ErrorManager.Instance.GetError(key)   
  16.   
  17.  *              err中前19个字符是错误发生的时间,后面是错误信息。   
  18.   
  19.  *           4. 为了捕捉Session超时的错误,而不是返回Session[key]是null的错误信息,本类增加了GetSession()   
  20.   
  21.  *              和SetSession函数来统一管理Session,以后aspx中不能直接读取Session,而必须通过本类来读取。   
  22.   
  23.  *    
  24.   
  25.  *    
  26.   
  27.  * 创建标识:   
  28.   
  29.  *   
  30.   
  31.  * 修改标识:   
  32.   
  33.  * 修改描述:   
  34.   
  35.  *   
  36.   
  37.  * 修改标识:   
  38.   
  39.  * 修改描述:   
  40.   
  41.  *----------------------------------------------------------------*/   
  42.   
  43. using System;   
  44.   
  45. using System.Data;   
  46.   
  47. using System.Configuration;   
  48.   
  49. using System.Web;   
  50.   
  51. using System.Web.Security;   
  52.   
  53. using System.Web.UI;   
  54.   
  55. using System.Web.UI.WebControls;   
  56.   
  57. using System.Web.UI.WebControls.WebParts;   
  58.   
  59. using System.Web.UI.HtmlControls;   
  60.   
  61. using System.Collections;   
  62.   
  63.   
  64.   
  65. /**//// <summary>   
  66.   
  67. /// Summary description for Error   
  68.   
  69. /// </summary>   
  70.   
  71. public class ErrorManager   
  72.   
  73. {   
  74.   
  75.     private System.Timers.Timer m_timer;   
  76.   
  77.     private Hashtable m_htErr;   
  78.   
  79.   
  80.   
  81.     /**//// <summary>   
  82.   
  83.     /// 私有的构造函数   
  84.   
  85.     /// </summary>   
  86.   
  87.     private ErrorManager()   
  88.   
  89.     {   
  90.   
  91.         this.m_timer = new System.Timers.Timer();   
  92.   
  93.         this.m_timer.Enabled = false;   
  94.   
  95.         this.m_timer.Interval = 12 * 60 * 60 * 1000;    //默认12个小时执行一次   
  96.   
  97.         this.m_timer.Elapsed += new System.Timers.ElapsedEventHandler(m_timer_Elapsed);   
  98.   
  99.         this.m_htErr = new Hashtable();   
  100.   
  101.     }   
  102.   
  103.   
  104.   
  105.     /**//// <summary>   
  106.   
  107.     /// 单例模式的接口   
  108.   
  109.     /// </summary>   
  110.   
  111.     public static readonly ErrorManager Instance = new ErrorManager();   
  112.   
  113.   
  114.   
  115.     /**//// <summary>   
  116.   
  117.     /// 设置定时器的频率,单位是毫秒   
  118.   
  119.     /// </summary>   
  120.   
  121.     /// <param name="Interval">毫秒</param>   
  122.   
  123.     public void SetTimerInterval(int Interval)   
  124.   
  125.     {   
  126.   
  127.         this.m_timer.Interval = Interval;   
  128.   
  129.     }   
  130.   
  131.   
  132.   
  133.     /**//// <summary>   
  134.   
  135.     /// 定时器开始   
  136.   
  137.     /// </summary>   
  138.   
  139.     public void TimerStart()   
  140.   
  141.     {   
  142.   
  143.         this.m_timer.Enabled = true;   
  144.   
  145.     }   
  146.   
  147.   
  148.   
  149.     /**//// <summary>   
  150.   
  151.     /// 定时器结束   
  152.   
  153.     /// </summary>   
  154.   
  155.     public void TimerStop()   
  156.   
  157.     {   
  158.   
  159.         this.m_timer.Enabled = false;   
  160.   
  161.     }   
  162.   
  163.   
  164.   
  165.     /**//// <summary>   
  166.   
  167.     /// 发生了一个错误,把错误信息保存起来,并返回错误的id,便于页面中读取   
  168.   
  169.     /// </summary>   
  170.   
  171.     /// <returns>返回错误的id</returns>   
  172.   
  173.     public string AddError()   
  174.   
  175.     {   
  176.   
  177.         string key = Guid.NewGuid().ToString();   
  178.   
  179.         string msg = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")   
  180.   
  181.             + HttpContext.Current.Server.GetLastError().GetBaseException().Message;   
  182.   
  183.         this.m_htErr.Add(key, msg);   
  184.   
  185.   
  186.   
  187.         HttpContext.Current.Server.ClearError();   
  188.   
  189.   
  190.   
  191.         return key;   
  192.   
  193.     }   
  194.   
  195.   
  196.   
  197.     /**//// <summary>   
  198.   
  199.     /// 返回指定Key的错误信息,前19个字符是错误发生的时间   
  200.   
  201.     /// </summary>   
  202.   
  203.     /// <param name="key">key,是一个guid</param>   
  204.   
  205.     /// <returns>返回错误信息</returns>   
  206.   
  207.     public string GetError(string key)   
  208.   
  209.     {   
  210.   
  211.         return this.m_htErr[key].ToString();   
  212.   
  213.     }   
  214.   
  215.   
  216.   
  217.     /**//// <summary>   
  218.   
  219.     /// 定时在Hashtable中清理错误信息   
  220.   
  221.     /// </summary>   
  222.   
  223.     /// <param name="sender"></param>   
  224.   
  225.     /// <param name="e"></param>   
  226.   
  227.     private void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)   
  228.   
  229.     {   
  230.   
  231.         ArrayList list = new ArrayList();   
  232.   
  233.         lock (this.m_htErr)   
  234.   
  235.         {   
  236.   
  237.             DateTime now = DateTime.Now;   
  238.   
  239.             TimeSpan ts;   
  240.   
  241.             foreach (string key in this.m_htErr.Keys)   
  242.   
  243.             {   
  244.   
  245.                 //前19个字符是错误发生的日期,yyyy-MM-dd HH:mm:ss   
  246.   
  247.                 string time = this.m_htErr[key].ToString().Substring(0, 19);       
  248.   
  249.                 ts = now - Convert.ToDateTime(time);   
  250.   
  251.                 if (ts.TotalMinutes > 20)   //把20分钟前的错误信息从hashtable中清除   
  252.   
  253.                     list.Add(key);   
  254.   
  255.             }   
  256.   
  257.   
  258.   
  259.             foreach (string key in list)   
  260.   
  261.             {   
  262.   
  263.                 this.m_htErr.Remove(key);   
  264.   
  265.             }   
  266.   
  267.         }   
  268.   
  269.   
  270.   
  271.     }   
  272.   
  273.   
  274.   
  275.   
  276.   
  277.     Session操作的封装#region Session操作的封装   
  278.   
  279.     /**//// <summary>   
  280.   
  281.     /// 取得指定键值的Session   
  282.   
  283.     /// </summary>   
  284.   
  285.     /// <param name="key">键值</param>   
  286.   
  287.     /// <returns>键内容值</returns>   
  288.   
  289.     public object GetSession(string key)   
  290.   
  291.     {   
  292.   
  293.         object val = HttpContext.Current.Session[key];   
  294.   
  295.         if (val == null)   
  296.   
  297.             throw new Exception("页面超时,请重新登录。");   
  298.   
  299.   
  300.   
  301.         return val;   
  302.   
  303.     }   
  304.   
  305.   
  306.   
  307.     /**//// <summary>   
  308.   
  309.     /// 设置Session   
  310.   
  311.     /// </summary>   
  312.   
  313.     /// <param name="key">键值</param>   
  314.   
  315.     /// <param name="val">键内容</param>   
  316.   
  317.     public void SetSession(string key, object val)   
  318.   
  319.     {   
  320.   
  321.         HttpContext.Current.Session[key] = val;   
  322.   
  323.     }  
  324.  
  325.     #endregion   
  326.   
  327. }  
posted on 2009-03-22 22:17  blue.net  阅读(289)  评论(0)    收藏  举报