C# Mvc异常处理过滤器

using System;
using System.Text;
using EMS.Domains.Core;
using System.Web.Mvc;
using Json.Net;
using Util.Webs;
using Json = Util.Json;

namespace EMS.MvcUI.Base
{
    public class FilterExceptionAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            var isAjax = filterContext.HttpContext.Request.IsAjaxRequest();
            if (isAjax)
            {
                if (filterContext.Exception is ShowException)
                {
                    filterContext.Result = new ContentResult
                    {
                        Content =
                            JsonConvert.SerializeObject(
                                new {Code = StateCode.Fail, Message = filterContext.Exception.Message, Data = ""})
                    };
                }
                else
                {
                    filterContext.Result = new ContentResult
                    {
                        Content =
                            JsonConvert.SerializeObject(new {Code = StateCode.Fail, Message = "服务器异常,请联系管理员", Data = ""})
                    };
                }
            }
            if (!(filterContext.Exception is ShowException))
            {
                WriteLog(filterContext);
            }
            filterContext.ExceptionHandled = true;
        }

        private Exception BuildErrorMessage(Exception ex)
        {
            while (ex.InnerException != null)
            {
                ex = ex.InnerException;
            }
            return ex;
        }

        private void WriteLog(ExceptionContext filterContext)
        {
            var httpContext = filterContext.RequestContext.HttpContext.Request;
            var ex = BuildErrorMessage(filterContext.Exception);
            // 在出现未处理的错误时运行的代码
            StringBuilder _builder = new StringBuilder();
            _builder.Append("\r\n-------------  异常信息   ---------------------------------------------------------------");
            _builder.Append("\r\n发生时间:" + DateTime.Now.ToString());
            _builder.Append("\r\n发生异常页:" + httpContext.Url.ToString());
            _builder.Append("\r\n异常信息:" + ex.Message);
            _builder.Append("\r\n错误源:" + ex.Source);
            _builder.Append("\r\n堆栈信息:" + ex.StackTrace);
            _builder.Append("\r\n-----------------------------------------------------------------------------------------\r\n");
            //日志物理路径

            DateTime date = DateTime.Now;
            string path = httpContext.MapPath("~/Log/");
            string month = date.ToString("yyyy-MM");
            if (!System.IO.Directory.Exists(path + month))
                System.IO.Directory.CreateDirectory(path + month);
            string currentDate = date.ToString("yyyy-MM-dd");
            string savePath = path + month + "/" + currentDate + ".log";
            System.IO.File.AppendAllText(savePath, _builder.ToString(), System.Text.Encoding.Default);
            //filterContext.RequestContext.HttpContext.Server.ClearError();
            //filterContext.ExceptionHandled = true;

            //filterContext.RequestContext.HttpContext.Response.Redirect("/Home/Error");
        }

    }
}
时间: 2024-10-10 16:29:46

C# Mvc异常处理过滤器的相关文章

学一学MVC的过滤器--异常处理

学习MVC不久,看到公司的项目里有日志记录功能,出于自己的原因一直没有看看是如何实现的,后来看了个学习视频和一些博文,才发现采用MVC里的过滤器 Filter 可以很容易实现,比较常见也很容易的做法就是继承  IActionFilter,IExceptionFilter 接口,然后实现里面的方法即可. 下面看一下代码,这是公司项目的一段代码,主要是将项目中出现的异常记录在 每天的txt日志文件里.当然实现日志的方法有很多种,这个只是其中一种,如果出现了IO错误,这种方法就不好说啦.  publi

ASP.NET MVC异常处理

ASP.NET MVC异常处理方案 如何保留异常前填写表单的数据 ASP.NET MVC中的统一化自定义异常处理 MVC过滤器详解 MVC过滤器使用案例:统一处理异常顺道精简代码 ASP.NET MVC下基于异常处理的完整解决方案

统一的mvc异常处理

mvc异常处理 using System; using System.Configuration; using System.Web.Mvc; using Infrastructure.Exceptions; using log4net; namespace Infrastructure.Web.ActionFilters { /// <summary> /// 统一处理Mvc站点异常过滤器 /// </summary> public class UnifyMvcSiteHandl

NET MVC异常处理模块

一个简单的ASP.NET MVC异常处理模块 一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行.异常处理应该是一个横切点,所谓横切点就是各个部分都会使用到它,无论是分层中的哪一个层,还是具体的哪个业务逻辑模块,所关注的都是一样的.所以,横切关注点我们会统一在一个地方进行处理.无论是MVC还是WebForm都提供了这样实现,让我们可以集中处理异常. 在MVC中,在FilterConfig中,已经默认

Asp.Net MVC part45 过滤器、模板页

过滤器 使用方式自定义类继承自相应的类或接口,重写方法,作为特性使用在控制器类中重写方法 特性方式的使用注意:如果继承自接口需要让类实现FilterAttribute,才可以作为特性使用使用方式1:作为Controller或Action的特性使用方式2:在Global中注册为全局过滤器,应用于所有的Controller的Action参数类均继承自ControllerContext,主要包含属性请求上下文.路由数据.结果 身份验证过滤器在约束的Action执行前执行重写OnAuthorizatio

MVC 异常过滤器

本文实现对MVC异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 第一步:写一个自己的异常过滤器,让它继承HandleErrorAttribute类 然后重写OnException()这个方法  (注:HandleErrorAttribute 类已经继承了FilterAttribute, IExceptionFilter这两个接口,并实现了它们,所以这我们只要继承HandleErrorAttribute就可以了) using System; using System.Colle

asp.net mvc之过滤器

先看一段实例 public class Log : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { Console.WriteLine("log-after"); } public void OnActionExecuting(ActionExecutingContext filterContext) { Console.WriteL

.Net Core MVC中过滤器简介

原文:.Net Core MVC中过滤器简介 在.Net Framework MVC 中有四种过滤器,授权过滤器(Authorize).Action 过滤器.结果过滤器(Result).异常过滤器(Exception)四种过滤器.在.Net Core MVC中,有五种过滤器,授权过滤器.Action过滤器.异常过滤器.结果过滤器.资源过滤器,新增了资源过滤器. .Net Core MVC和.Net Framework MVC在基本使用上差别不大,主要的还是框架的差别.其中路由是个很重要的东西,参

MVC 授权过滤器 AuthorizeAttribute

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc; namespace 过滤器.Filtes{ /// <summary> /// 授权过滤器,在Action过滤器之前执行/// </summary> public class MyAuthorizeAttribute : AuthorizeAttribute { /// <