方法类
/// <summary> /// 运行监控类 /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class StatisticsTrackerAttribute : ActionFilterAttribute { private readonly string Key = "_thisOnActionMonitorLog_"; #region Action运行监控 public override void OnActionExecuting(ActionExecutingContext filterContext) { MonitorLog MonLog = new MonitorLog(); MonLog.ExecuteStartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff", DateTimeFormatInfo.InvariantInfo)); MonLog.ControllerName = filterContext.RouteData.Values["controller"] as string; MonLog.ActionName = filterContext.RouteData.Values["action"] as string; //获取Action的自定义属性 var attributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(ActionDescribeAttribute), true); if (attributes != null && attributes.Length > 0) { ActionDescribeAttribute myAttribute = attributes[0] as ActionDescribeAttribute; if (myAttribute != null) { MonLog.ActionInstructions = myAttribute.DisplayName; } } filterContext.Controller.ViewData[Key] = MonLog; base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { MonitorLog MonLog = filterContext.Controller.ViewData[Key] as MonitorLog; MonLog.ExecuteEndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff", DateTimeFormatInfo.InvariantInfo)); MonLog.FormCollections = filterContext.HttpContext.Request.Form;//form表单提交的数据 MonLog.QueryCollections = filterContext.HttpContext.Request.QueryString;//Url 参数 MonLog.AbsoluteUri = filterContext.HttpContext.Request.Url.AbsoluteUri; base.OnActionExecuted(filterContext); } #endregion #region View 视图生成时间监控 public override void OnResultExecuting(ResultExecutingContext filterContext) { MonitorLog MonLog = filterContext.Controller.ViewData[Key] as MonitorLog; MonLog.ResultExecuteStartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff", DateTimeFormatInfo.InvariantInfo)); base.OnResultExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { MonitorLog MonLog = filterContext.Controller.ViewData[Key] as MonitorLog; MonLog.ResultExecuteEndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff", DateTimeFormatInfo.InvariantInfo)); //写日志 filterContext.Controller.ViewData.Remove(Key); MonLog.GetLoginfo(); base.OnResultExecuted(filterContext); } #endregion } /// <summary> /// 程序运行错误 收集器 /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)] public class LogExceptionAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (!filterContext.ExceptionHandled) { try { string sForm = this.GetCollections(filterContext.HttpContext.Request.Form); string sQuery = this.GetCollections(filterContext.HttpContext.Request.QueryString); string ControllerName = string.Format("{0}Controller", filterContext.RouteData.Values["controller"] as string); string ActionName = filterContext.RouteData.Values["action"] as string; string message = string.Format(@" 在执行 controller[{0}] 的 action[{1}] 时产生异常。 异常类型:{2} <br>异常内容:{3} <br>引发异常的方法:{4} <br>引发异常源:{5} <br>参数:{6}" , ControllerName , ActionName , filterContext.Exception.GetType().Name , filterContext.Exception.Message , filterContext.Exception.TargetSite , filterContext.Exception.Source + filterContext.Exception.StackTrace , sForm + sQuery ); //记录日志 LoggerBusiness.WriteLog(message, "Web程序运行错误"); } catch (Exception) { } base.OnException(filterContext); } } /// <summary> /// 获取Post 或Get 参数 /// </summary> /// <param name="Collections"></param> /// <returns></returns> public string GetCollections(NameValueCollection Collections) { string Parameters = string.Empty; if (Collections == null || Collections.Count == 0) { return Parameters; } foreach (string key in Collections.Keys) { Parameters += string.Format("{0}:{1};", key, Collections[key]); } if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith(";")) { Parameters = Parameters.Substring(0, Parameters.Length - 1); } return Parameters; } } /// <summary> /// 描述属性 /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class ActionDescribeAttribute : Attribute { public string DisplayName { get; set; } public ActionDescribeAttribute() { this.DisplayName = ""; }
使用方法
1 [StatisticsTrackerAttribute] 2 [LogException] 3 public class ManageController : Controller 4 { 5 // 6 // GET: /Manage/ 7 [ActionDescribe(DisplayName="加载首页")] 8 public ActionResult Index() 9 { 10 return View(); 11 } 12 }