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. HDU 5773 The All-purpose Zero(树状数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5773 [题目大意] 给出一个非负整数序列,其中的0可以替换成任意整数,问替换后的最长严格上升序列长 ...

  2. iOS中菊花。。。

    其实系统的菊花除了功能有点单一,不具有刷新页面的功能以外,其他都还好吧,满足你一些正常的提示功能还是绰绰有余的:直接把项目里面的代码粘出来吧,其实也没有什么特别要注意的地方,一些设置属性也算留个备份 ...

  3. What Is Your Grade?(水,排序)

    What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. Android开发_SQLite使用方法技巧

    SQLite介绍 SQLite是轻量级的.嵌入式的.关系型数据库,目前已经在iPhone.Android等手机系统中使用,SQLite可移植性好,很容易使用,很小,高效而且可靠.SQLite嵌入到使用 ...

  5. cuda核函数再调用核函数,多层并行

    #include <stdio.h> __global__ void childKernel(int i) { int tid = blockIdx.x*blockDim.x+thread ...

  6. HTTP请求和数据安全

    /*------------------------------------- 01 HTTP请求 ---------------------------------------*/ 重点:1.超文本 ...

  7. java web分享ppt大纲 -- servlet容器简介

    今天在公司分享了java web的ppt,把ppt大纲放在这里,希望可以帮助需要的人 servlet容器简介 定义 狭义上的,servlet容器为java Web应用提供运行时环境,负责管理servl ...

  8. zen-coding for notepad++,前端最佳手写代码编辑器

    zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器. zen-Coding插件支持多种编辑器 ...

  9. Poj 3517 And Then There Was One(约瑟夫环变形)

    简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个 ...

  10. Git跨平台中文乱码临时解决方案

    Git 是一个非常优秀的分布式版本控制系统,最初为Linux Kernel版本管理进行量身定做.优点是,和其他版本控制系统相比,稳定,速度快,跨平台,易学易用,无需要花费成本.更多优点请点击阅读:ht ...