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. xmemcached的time out

    最近维护线上发现不停有java.util.concurrent.TimeoutException: Timed out(200) waiting for operation的问题,排查程序.配置文件的 ...

  2. sublime的20个插件

    SublimeText是一款非常精巧的文本编辑器,适合编写代码.做笔记.写文章.它用户界面十分整洁,功能非同凡响,性能快得出奇.这些非常棒的特性 包括任意跳转(Goto Anything).多重选择( ...

  3. JS HTML DOM

    HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...

  4. MinGW gcc 生成动态链接库 dll 的一些问题汇总 (补充)

    我以前写过一个小短文,介绍MinGW gcc 生成动态链接库 dll 的一些问题.当时写的并不全面.近期又遇到写新的问题.这里记录一下,做个补充. 通常情况下,dll 中的函数假设採用 _stdcal ...

  5. C++中delete 和delete[]的区别

    c++告诉我们在回收new分配的单个对象的内存空间的时候用delete,   回收new[ ]分配的一组对象的内存空间的时候用 delete[ ]; #include <iostream> ...

  6. ios 设备用jquery live绑定 click 事件不管用

    问题描述:用js拼接的html追加到页面,然后用 live 绑定click事件不起作用 解决办法:1.直接在标签写onclick事件   2.给需要绑定的标签添加css样式{cursor:pointe ...

  7. ASP.NET之电子商务系统开发-2(购物车功能)

    一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...

  8. iOS 中UITableViewController 中tableView 会被状态栏覆盖的问题

    解决办法在 生命周期函数viewDidAppear中设置即可 - (void)viewDidAppear:(BOOL)animated { self.tableView.frame = CGRectM ...

  9. java中如何计算两个时间段的月份差

    直接计算,先取得两个日期的年份和月份,月份差=(第二年份-第一年份)*12 + 第二月份-第一月份

  10. 原型扩展的方法解决IE和Firefox的Js兼容问题

    if(!document.all){//textContent->text    Element.prototype.__defineGetter__('text',function(){ret ...