博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②...
阅读量:4656 次
发布时间:2019-06-09

本文共 13387 字,大约阅读时间需要 44 分钟。

上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来。

首先我们在App.Common类库中创建一个通用类ResultHelper,这个类里面写了,获取一个GUID,获取当前时间,处理字符串等操作,虽然我们目前要用到的一个就是获取GUID但是以后我们可能还要用到别的,所以我都把他放进入了

然后在App.Admin创建一个核心文件夹,Core,放入LogHandler这个类是主要是写入日志,避免在每次都要实例化这个类,我把他封装起来,大家一看就知道。

然后修改Controller的Create方法,代码如下一一给出。

using System;using System.Web;using System.Text.RegularExpressions;namespace App.Common{    public class ResultHelper    {        ///         /// 创建一个全球唯一的32位ID        ///         /// 
ID串
public static string NewId { get { string id = DateTime.Now.ToString("yyyyMMddHHmmssfffffff"); string guid = Guid.NewGuid().ToString().Replace("-", ""); id += guid.Substring(0, 10); return id; } } public static string NewTimeId { get { string id = DateTime.Now.ToString("yyyyMMddHHmmssfffffff"); return id; } } /// /// 截取字符串 /// /// 字符串 /// 剩下长度 ///
指定字符串并加...
public static string SubValue(string value, int length) { if (value.Length > length) { value = value.Substring(0, length); value = value + "..."; return NoHtml(value); } else { return NoHtml(value); } } //还原的时候 public static string InputText(string inputString) { if ((inputString != null) && (inputString != String.Empty)) { inputString = inputString.Trim(); //if (inputString.Length > maxLength) //inputString = inputString.Substring(0, maxLength); inputString = inputString.Replace("
", "\n"); inputString = inputString.Replace("&", "&"); inputString = inputString.Replace("'", "''"); inputString = inputString.Replace("<", "<"); inputString = inputString.Replace(">", ">"); inputString = inputString.Replace("chr(60)", "<"); inputString = inputString.Replace("chr(37)", ">"); inputString = inputString.Replace("\"", """); inputString = inputString.Replace(";", ";"); return inputString; } else { return ""; } } //添加的时候 public static string OutputText(string outputString) { if ((outputString != null) && (outputString != String.Empty)) { outputString = outputString.Trim(); outputString = outputString.Replace("&", "&"); outputString = outputString.Replace("''", "'"); outputString = outputString.Replace("<", "<"); outputString = outputString.Replace(">", ">"); outputString = outputString.Replace("<", "chr(60)"); outputString = outputString.Replace(">", "chr(37)"); outputString = outputString.Replace(""", "\""); outputString = outputString.Replace(";", ";"); outputString = outputString.Replace("\n", "
"); return outputString; } else { return ""; } } /// /// 去除HTML标记 /// /// 包括HTML的源码 ///
已经去除后的文字
public static string NoHtml(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @"
]*?>.*?", "", RegexOptions.IgnoreCase); //删除HTML Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"
ResultHelper
using System;using System.Collections.Generic;using System.Linq;using System.Web;using App.Common;using App.DAL;using App.IBLL;using App.Models;using Microsoft.Practices.Unity;namespace App.Admin{    public static class LogHandler    {        [Dependency]        public static ISysLogBLL logBLL { get; set; }        ///         /// 写入日志        ///         /// 操作人        /// 操作信息        /// 结果        /// 类型        /// 操作模块        public static void WriteServiceLog(string oper, string mes, string result, string type, string module)        {                                          SysLog entity = new SysLog();                entity.Id = ResultHelper.NewId;                entity.Operator = oper;                entity.Message = mes;                entity.Result = result;                entity.Type = type;                entity.Module = module;                entity.CreateTime = ResultHelper.NowTime;                using (SysLogRepository logRepository = new SysLogRepository())                {                    logRepository.Create(entity);                }                }    }}
LogHandler
[HttpPost]        public JsonResult Create(SysSampleModel model)        {                if (m_BLL.Create(model))                {                    LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");                    return Json(1, JsonRequestBehavior.AllowGet);                }                else                {                    LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "失败", "创建", "样例程序");                    return Json(0, JsonRequestBehavior.AllowGet);                }             }
SysSampleController

同时App.Common要引用程序集System.Web

运行添加一条记录,然后打开我们的日志模块,OK,日志记录完成了,有点简单。

接下来是异常,上一讲说到,异常我们放在BLL中处理,然后我们把错误或者异常信息返回到Controller中被日志记录,当然异常他是在BLL层被记录的。

我们需要一个异常的集合类,来记录BLL层和DAL层,有时候DAL也要处理异常,所以我们也要用到ref 引用传递,貌似ref我们很喜欢,呵呵

见代码,在App.Common创建一个异常集合类

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace App.Common{    public class ValidationError    {        public ValidationError() { }        public string ErrorMessage { get; set; }           }    public class ValidationErrors : List
{ ///
/// 添加错误 /// ///
信息描述 public void Add(string errorMessage) { base.Add(new ValidationError { ErrorMessage = errorMessage }); } ///
/// 获取错误集合 /// public string Error { get { string error = ""; this.All(a => { error += a.ErrorMessage; return true; }); return error; } } }}
ValidationErrorHelper.cs

我们也要创建一个封装好的异常写入,类似与Log的LogHandler封装但我们放在BLL中,因为我们以后的其他项目的BLL要引用,这一步要考虑到。

在BLL中创建文件夹Core,写入以下类,BLL引用程序集System.Web里面用到了http的一些方法

using System;using System.Web.Configuration;using App.Models;using System.IO;using System.Text;using App.Common;namespace App.BLL.Core{        ///         /// 写入一个异常错误        ///         /// 异常        public static class ExceptionHander        {            ///             /// 加入异常日志            ///             /// 异常            public static void WriteException(Exception ex)            {                                   try                    {                        using (DBContainer db = new DBContainer())                        {                            SysException model = new SysException()                            {                                Id = ResultHelper.NewId,                                HelpLink = ex.HelpLink,                                Message = ex.Message,                                Source = ex.Source,                                StackTrace = ex.StackTrace,                                TargetSite = ex.TargetSite.ToString(),                                Data =ex.Data.ToString(),                                CreateTime = ResultHelper.NowTime                                                            };                            db.SysException.AddObject(model);                            db.SaveChanges();                        }                    }                    catch (Exception ep)                    {                        try                        {                            //异常失败写入txt                            string path = @"~/exceptionLog.txt";                            string txtPath = System.Web.HttpContext.Current.Server.MapPath(path);//获取绝对路径                            using (StreamWriter sw = new StreamWriter(txtPath, true, Encoding.Default))                            {                                sw.WriteLine((ex.Message + "|" + ex.StackTrace + "|" + ep.Message + "|" + DateTime.Now.ToString()).ToString());                                sw.Dispose();                                sw.Close();                            }                            return;                        }                        catch { return; }                    }                            }        }    }
ExceptionHander

此异常当处理也异常时候,将在网站根目录下写入一个txt文件。

创建一个全局变量

ValidationErrors errors = new ValidationErrors();

我们要用引用传递,所以要修改IBLL和BLL的Create方法,如下

ISysSampleBLL  :  bool Create(ref ValidationErrors errors, SysSampleModel model);

SysSampleBLL   :

///         /// 创建一个实体        ///         /// 持久的错误信息        /// 模型        /// 
是否成功
/// /// 创建一个实体 /// /// 持久的错误信息 /// 模型 ///
是否成功
public bool Create(ref ValidationErrors errors, SysSampleModel model) { try { SysSample entity = Rep.GetById(model.Id); if (entity != null) { errors.Add("主键重复"); return false; } entity = new SysSample(); entity.Id = model.Id; entity.Name = model.Name; entity.Age = model.Age; entity.Bir = model.Bir; entity.Photo = model.Photo; entity.Note = model.Note; entity.CreateTime = model.CreateTime; if (Rep.Create(entity) == 1) { return true; } else { errors.Add("插入失败"); return false; } } catch (Exception ex) { errors.Add(ex.Message); ExceptionHander.WriteException(ex); return false; } }

修改Controller

[HttpPost]        public JsonResult Create(SysSampleModel model)        {                if (m_BLL.Create(ref errors, model))                {                    LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");                    return Json(1, JsonRequestBehavior.AllowGet);                }                else                {                    string ErrorCol = errors.Error;                    LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name + "," + ErrorCol, "失败", "创建", "样例程序");                    return Json(0, JsonRequestBehavior.AllowGet);                }             }

 注意:ExceptionHander.WriteException(ex);这里是写入异常信息

OK,你现在可以创建一条新的记录和插入一个ID大于50个字符的记录,让他记录日志和异常了。

显然我们的失败错误提示已经不符合国情了。我们返回的json格式是0和1我们要返回多个值了,比如1和成功创建,0和失败了啊,这样的2个值怎么办?

controller能把datagrid传过来的东西用类来接受,那么反过来想,js也能把controller发出去的值分解,创建一个序列化的类

在App.Common类库中创建JsonHandler帮助类,里面有2个重载,一个是返回3个值一个是2个值的。

所以当我们要返回订单的数量和总价格的时候,我们将用到类似的手段

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace App.Common{    public class JsonHandler    {        public static JsonMessage CreateMessage(int ptype,string pmessage,string pvalue)        {            JsonMessage json = new JsonMessage()            {                type = ptype,                message = pmessage,                value = pvalue            };            return json;        }        public static JsonMessage CreateMessage(int ptype, string pmessage)        {            JsonMessage json = new JsonMessage()            {                type = ptype,                message = pmessage,            };            return json;        }    }    public class JsonMessage    {        public int type{
get;set;} public string message{
get;set;} public string value{
get;set;} }}
JsonHandler

再次修改Controller的Create

[HttpPost]        public JsonResult Create(SysSampleModel model)        {            if (m_BLL.Create(ref errors, model))            {                LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");                return Json(JsonHandler.CreateMessage(1, "插入成功"), JsonRequestBehavior.AllowGet);            }            else            {                string ErrorCol = errors.Error;                LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name + "," + ErrorCol, "失败", "创建", "样例程序");                return Json(JsonHandler.CreateMessage(0, "插入失败" + ErrorCol), JsonRequestBehavior.AllowGet);            }             }

修改SysSample的Create的JS部分

 

由于时间关系,这一讲就先到这里吧!这一讲其实比较仓促。不懂的留言

你需要继续做的就是在删除,编辑等操作也加入这些的。这点留给大家自己表现吧....

下一讲是全局异常的捕获。

转载于:https://www.cnblogs.com/ymnets/p/3436579.html

你可能感兴趣的文章
四川红油的制法
查看>>
Java重写《C经典100题》 --21
查看>>
【Android基础】Fragment 详解之Fragment生命周期
查看>>
链表(裸题)
查看>>
11运算符重载
查看>>
磁盘系统的管理
查看>>
C/S
查看>>
Http Get/Post请求的区别
查看>>
STM32一键下载电路设计原理
查看>>
C语言中函数返回字符串的四种方法
查看>>
10月区块链领域投融资事件盘点
查看>>
Mybatis缓存策略
查看>>
卷积的意义【转】
查看>>
android图形系统详解五:Android绘制模式
查看>>
[剑指offer] 23. 二叉搜索树的后序遍历序列
查看>>
canvas绘画交叉波浪
查看>>
Linux 内核分析
查看>>
试一下:XP ( SP2 ) 本身就支持查杀流氓软件!
查看>>
centos6(7) minimal 基本环境配置
查看>>
maven 构建可执行jar文件
查看>>