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 中使用全局过滤器进行异常捕获记录的更多相关文章

  1. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  2. Linux中生成Core Dump系统异常信息记录文件的教程

    Linux中生成Core Dump系统异常信息记录文件的教程 http://www.jb51.net/LINUXjishu/473351.html

  3. vue-cli项目中使用全局过滤器及传参(日期格式化)

    // 过滤日期格式,传入时间戳,根据参数返回不同格式 const formatTimer = function(val, hours) { if (val) { ); var y = dateTime ...

  4. 在 ASP.NET Web API 中使用 Attribute 统一处理异常

    并非所有的异常都需要 try-catch 进行重复的处理,这会导致大量的重复性代码,一旦后续系统出现异常处理机制的修改,随着代码量增多,修改也会变的更加困难. ASP.NET Web API 中特别增 ...

  5. Asp.Net MVC4中的全局过滤器,

    可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码:  FilterConfig.RegisterGlobalFilters(GlobalFilters ...

  6. Asp.Net MVC4中的全局过滤器

    可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码:  FilterConfig.RegisterGlobalFilters(GlobalFilters ...

  7. MVC小系列(十三)【全局异常处理与异常日志】

    在MVC网站的global.asax中的Application_Start方法里,有这样一段代码 protected void Application_Start() { //它的主要作用是将全局过滤 ...

  8. Vue 项目中添加全局过滤器以及全局混合mixin

    可以在.vue文件中定义局部使用的过滤器 export default{ data(){ return [] }, filters:{ toUpperCase:function(value){ ret ...

  9. ASP.NET Core Web API中实现全局异常捕获与处理

    处理全局异常 HANDLING ERRORS GLOBALLY 在上面的示例中,我们的 action 内部有一个 try-catch 代码块.这一点很重要,我们需要在我们的 action 方法体中处理 ...

随机推荐

  1. Groovy中那些神奇注解之ToString

    继续上一篇:Groovy中那些神奇注解之Memoized 这篇就讲讲@groovy.transform.ToString这个注解,这注解太熟悉了,熟悉到让人一看就知道是干吗的,不就是把Bean转在St ...

  2. cocos2dx CCControlSwitch

    CCControlSwitch也是extension中的控件,本身比较简单,直接上例子 // on "init" you need to initialize your insta ...

  3. Struts 和Spring的核心控制器

    Struts 核心控制器是FilterDispatch Spring核心控制器是DispatchServlet

  4. 基于xml文件实现系统属性配置管理

    文章标题:基于xml文件实现系统属性配置管理 . 文章地址: http://blog.csdn.net/5iasp/article/details/11774501 作者: javaboy2012 E ...

  5. poj 1459 (最大流)

    最大流简单题,,这题重要的是知道了scanf("%s",str);sscanf(str,"(%d,%d)%d",&x,&y,&w);读入 ...

  6. GridView行编辑、更新、取消、删除事件使用方法

    注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框.为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码.这样就能使你想编辑的列转换成文 ...

  7. flexbox 伸缩布局盒

    Flexbox(伸缩布局盒) 是 CSS3 中一个新的布局模式,为了现代网络中更为复杂的网页需求而设计. Flexbox 由 伸缩容器 和 伸缩项目 组成.通过设置元素的 display 属性为   ...

  8. Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

    Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...

  9. AOP annotation

    1.xml文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http ...

  10. MySqlQueryList

    //辅助查询列表,或实例 public class MySqlQueryList { #region List<T> ToList<T>(string sql, params ...