asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处
using SuperManCore;
using System.Web;
using System.Web.Mvc;
namespace SuperMan
{
public class FilterConfig
{
/// <summary>
/// 注册全局过滤器 add by caoheyang 20150205
/// </summary>
/// <param name="filters"></param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new WebHandleErrorAttribute(), 1);
filters.Add(new HandleErrorAttribute(), 2);
}
}
/// <summary>
/// 自定义异常处理类 add by caoheyang 20150205
/// </summary>
public class WebHandleErrorAttribute : HandleErrorAttribute
{
/// <summary>
/// 重写异常处理方法 add by caoheyang 20150205 需要将该特性标注于各个controller上。
/// </summary>
/// <param name="filterContext">上下文对象 该类继承于ControllerContext</param>
public override void OnException(ExceptionContext filterContext)
{
LogHelper.LogWriterFromFilter(filterContext.Exception);
}
}
}
MVC API下的注册方式如下:
在WebApiConfig.cs文件下加入标红代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using Microsoft.Owin.Security.OAuth;
using Newtonsoft.Json.Serialization;
namespace SuperManWebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// 将 Web API 配置为仅使用不记名令牌身份验证。
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.Filters.Add(new ApiHandleErrorAttribute()); //注册全局异常过滤器 add by caoheyang 20150206 不需要将该特性标注于各个controller上
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
/// <summary> /// 自定义异常处理类 add by caoheyang 20150205 不需要将该特性标注于各个controller上。 /// </summary> public class ApiHandleErrorAttribute : ExceptionFilterAttribute { /// <summary> /// 重写异常处理方法 add by caoheyang 20150205 /// </summary> /// <param name="filterContext">上下文对象 该类继承于ControllerContext</param> public override void OnException(HttpActionExecutedContext filterContext) { LogHelper.LogWriterFromFilter(filterContext.Exception); }
}
另外附LogHelper源码:
public class LogHelper
{
public static Logger logger = LogManager.GetLogger("SuperManCore.LogHelper");
/// <summary>
/// 备注日志
/// </summary>
/// <param name="dec">需要捕获的参数(必须为属性类)</param>
/// <param name="rmark">描述操作</param>
public new static void LogWriter(string rmark="",object dec=null)
{
try
{
string logstr = "\r\n-----------------start----------------------\r\n";
MethodBase m = new StackTrace().GetFrame(1).GetMethod();
ParameterInfo[] pm = m.GetParameters();
string classname = m.DeclaringType.ToString();
string propertyName = m.Name;
logstr = logstr + "备注:" + rmark + "\r\n";
//写类名
logstr = logstr + "函数类名:" + classname + "\r\n";
//写函数方法
logstr = logstr + "函数名称为:" + propertyName + "\r\n";
for (int i = 0; i < pm.Length; i++)
{
logstr = logstr + "函数的参数有:" + pm[i].Name.ToString() + "\r\n";
}
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
logstr = logstr + "函数参数值:" + jsonSerializer.Serialize(dec) + "\r\n";
logstr += "--------------------end---------------------\r\n";
//写日志
logger.Info(logstr);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 异常捕获日志
/// </summary>
/// <param name="ex">异常对象(必须为属性类)</param>
/// <param name="rmark">操作简要描述</param>
public new static void LogWriter(Exception ex, string rmark="")
{
try
{
string logstr = "\r\n-----------------start----------------------\r\n";
MethodBase m = new StackTrace().GetFrame(1).GetMethod();
ParameterInfo[] pm = m.GetParameters();
string classname = m.DeclaringType.ToString();
string propertyName = m.Name;
logstr = logstr + "备注:" + rmark + "\r\n";
//写类名
logstr = logstr + "函数类名:" + classname + "\r\n";
//写函数方法
logstr = logstr + "函数名称为:" + propertyName + "\r\n";
for (int i = 0; i < pm.Length; i++)
{
logstr = logstr + "函数的参数有:" + pm[i].Name.ToString() + "\r\n";
}
logstr = logstr + "函数异常:" + ex.ToString() + "\r\n";
logstr += "--------------------end---------------------\r\n";
//写日志
logger.Info(logstr);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 带参数 异常的日志
/// </summary>
/// <param name="dec">异常参数对象(必须为属性类)</param>
/// <param name="ex">日志异常对象</param>
public new static void LogWriter(object dec, Exception ex)
{
try
{
string logstr = "\r\n-----------------start----------------------\r\n";
MethodBase m = new StackTrace().GetFrame(1).GetMethod();
ParameterInfo[] pm = m.GetParameters();
string classname = m.DeclaringType.ToString();
string propertyName = m.Name;
//写类名
logstr = logstr + "函数类名:" + classname + "\r\n";
//写函数方法
logstr = logstr + "函数名称为:" + propertyName + "\r\n";
for (int i = 0; i < pm.Length; i++)
{
logstr = logstr + "函数的参数有:" + pm[i].Name.ToString() + "\r\n";
}
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
logstr = logstr + "函数参数值:" + jsonSerializer.Serialize(dec) + "\r\n";
logstr = logstr + "函数异常:" + ex.ToString() + "\r\n";
logstr += "--------------------end---------------------\r\n";
//写日志
logger.Info(logstr);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 带参数 描述 异常日志捕获
/// </summary>
/// <param name="dec">所要捕获的参数(必须为属性类)</param>
/// <param name="ex">异常对象</param>
/// <param name="rmark">描述</param>
public new static void LogWriter(object dec, Exception ex, string rmark)
{
try
{
string logstr = "\r\n-----------------start----------------------\r\n";
MethodBase m = new StackTrace().GetFrame(1).GetMethod();
ParameterInfo[] pm = m.GetParameters();
string classname = m.DeclaringType.ToString();
string propertyName = m.Name;
//写备注
logstr = logstr + "备注:" + rmark + "\r\n";
//写类名
logstr = logstr + "函数类名:" + classname + "\r\n";
//写函数方法
logstr = logstr + "函数名称为:" + propertyName + "\r\n";
for (int i = 0; i < pm.Length; i++)
{
logstr = logstr + "函数的参数有:" + pm[i].Name.ToString() + "\r\n";
}
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
logstr = logstr + "函数参数值:" + jsonSerializer.Serialize(dec) + "\r\n";
logstr = logstr + "函数异常:" + ex.ToString() + "\r\n";
logstr += "--------------------end---------------------\r\n";
//写日志
logger.Info(logstr);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 捕获全局异常
/// </summary>
/// <param name="error"></param>
public new static void LogWriterFromFilter(Exception error)
{
try
{
string logstr = "\r\n-----------------start----------------------\r\n";
//异常发生地址
logstr = logstr + "异常发生地址:" + HttpContext.Current.Request.Url.AbsoluteUri.ToString() + "\r\n";
logstr = logstr + "请求类型:" + HttpContext.Current.Request.RequestType.ToString() + "\r\n";
logstr = logstr + "异常:" + error.ToString() + "\r\n";
logstr += "--------------------end---------------------\r\n";
//发送邮件
if (ConfigSettings.Instance.IsSendMail == "true")
{
string emailToAddress = ConfigSettings.Instance.EmailToAdress;
EmailHelper.SendEmailTo(logstr, emailToAddress);
}
//写日志
logger.Info(logstr);
}
catch (Exception)
{
throw;
}
}
}
注:LogHelper所在类库需要引用NLog.dll文件。
asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录的更多相关文章
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- Linux中生成Core Dump系统异常信息记录文件的教程
Linux中生成Core Dump系统异常信息记录文件的教程 http://www.jb51.net/LINUXjishu/473351.html
- vue-cli项目中使用全局过滤器及传参(日期格式化)
// 过滤日期格式,传入时间戳,根据参数返回不同格式 const formatTimer = function(val, hours) { if (val) { ); var y = dateTime ...
- 在 ASP.NET Web API 中使用 Attribute 统一处理异常
并非所有的异常都需要 try-catch 进行重复的处理,这会导致大量的重复性代码,一旦后续系统出现异常处理机制的修改,随着代码量增多,修改也会变的更加困难. ASP.NET Web API 中特别增 ...
- Asp.Net MVC4中的全局过滤器,
可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalFilters(GlobalFilters ...
- Asp.Net MVC4中的全局过滤器
可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalFilters(GlobalFilters ...
- MVC小系列(十三)【全局异常处理与异常日志】
在MVC网站的global.asax中的Application_Start方法里,有这样一段代码 protected void Application_Start() { //它的主要作用是将全局过滤 ...
- Vue 项目中添加全局过滤器以及全局混合mixin
可以在.vue文件中定义局部使用的过滤器 export default{ data(){ return [] }, filters:{ toUpperCase:function(value){ ret ...
- ASP.NET Core Web API中实现全局异常捕获与处理
处理全局异常 HANDLING ERRORS GLOBALLY 在上面的示例中,我们的 action 内部有一个 try-catch 代码块.这一点很重要,我们需要在我们的 action 方法体中处理 ...
随机推荐
- Linux ---> 监控JVM工具
Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...
- C语言数据结构----栈与递归
本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...
- ubuntu12.04下 安装虚拟主机
Ubuntu Linux 方法一 一.修改/etc/apache2/sites-available/ 1. 打开目录 /etc/apache2/sites-available/, 发现 default ...
- linux杂谈(十七):iscsi存储分离技术
1.iscsi简单介绍 iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道.透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机能够透过快速的局域网集线来 ...
- Introduction to Probability (5) Continus random variable
CONTINUOUS RANDOM VARIABLES AND PDFS 连续的随机变量,顾名思义.就是随机变量的取值范围是连续的值,比如汽车的速度.气温.假设我们要利用这些參数来建模.那么就须要引 ...
- ajax异步服务器获取时间
1.创建ajax对象 <script type="text/javascript"> //创建AJAX异步对象 function createAJAX(){ var a ...
- python生成器之斐波切纳数列
面试的时候遇到过这样的一个题目: 斐波切纳数列1,2,3,5,8,13,21.........根据这样的规律,编程求出400万以内最大的斐波切纳数,并求出是第几个斐波切纳数. 方法一: 方法二:这个方 ...
- C# 自定义控件的一些文章和博客
http://blog.csdn.net/songkexin/archive/2009/12/08/4961215.aspx http://www.cnblogs.com/yuanfan/archiv ...
- INDEX相关
1.索引应该建立在WHERE子句经常用到的表列上,如果在大表上频率使用某列或者某几列作为条件执行检索操作,并且检索的行数低于总行数的15%,那么应该考虑在该几行上添加索引. 2.为了提高多表连接的性能 ...
- Oracle10g--plSql命令
每天学点Oracle10g--plSql命令 附录B SQL*PLUS Sql*plus 中使用绑定变量: sql> variable x number; sql> exec :x := ...