ASP.NET Core2.2 IExceptionFilter
用vs2017建立一个ASP.NET Core Web应用程序并选择MVC框架,自动生成了 Startup的类,并配置了错误处理方式:
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
简单讲:
- 开发环境,直接在当前页面显示错误
- 生产环境:跳转到 /Home/Error页面
而在实际开发和生产过程中,我们需要:
- 开发环境,我们有时候会用到ajax调用,需要快速定位错误(比如alert(....))
- 生产环境:我们需要把错误信息保存起来,当然ajax调用的时候不能直接alert一个/Home/Error的html给用户
如下面的代码:
Action:
        public IActionResult Edit(int id = 0)
        {
            if (id == 0)  //模拟用户不能修改该Id的内容
                return NotFound("没有操作权限");
            if (id == 1)  //模拟发生异常了
                throw new Exception("错误:error desc");
            return View();
        }
        /// <summary>
        /// ajax调用
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Save(int id = 0)
        {
            if (id == 0) //模拟用户不能修改该Id的内容
                return NotFound("没有操作权限");
            if (id == 1) //模拟发生异常了
                throw new Exception("错误:error desc");
            return Content(id + DateTime.Now.ToString());
        }
View(Edit.cshtml)
<div class="text-center">
    id:
    <input type="text" id="TId" />
    <input type="button" value="Save" id="BSave" />
    <span id="SResult"></span>
</div>
@section scripts
    {
    <script>
        $(function () {
            $("#BSave").click(function () {
                $.ajax({
                    type: "post",
                    url: "@Url.Action("Save")",
                    data: { id: $("#TId").val() },
                    success: function (ret) {
                        $("#SResult").html(ret);
                    },
                    error: function (XMLHttpRequest) {
                        if (XMLHttpRequest.responseText != "") {
                            alert(XMLHttpRequest.responseText);
                        }
                        else
                            alert(XMLHttpRequest.status );
                    }
                });
            });
        });
    </script>
}
Ctrl+F5##运行:

好,我们需要保存错误信息,并更友好的提示ajax调用错误。
1.添加一个类
    public class FilterException :  IExceptionFilter
    {
        private readonly YKDbContext db;
        private readonly IHostingEnvironment _Env;
        public FilterException(YKDbContext dbContext, IHostingEnvironment env)
        {
            db = dbContext;
            _Env = env;
        }
        public void OnException(ExceptionContext context)
        {
            if (_Env.IsDevelopment())
            {
                if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
                {
                    context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    string msg = context.Exception.Message;
                    Exception ex = context.Exception;
                    while (ex.InnerException != null)
                    {
                        ex = ex.InnerException;
                        msg += ex.Message;
                    }
                    context.Result = new JsonResult(msg);
                    context.ExceptionHandled = true; // 表明异常已处理,客户端可得到正常返回
                }
            }
            else
            {
                string msg = context.Exception.Message;
                Exception ex = context.Exception;
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    msg += ex.Message;
                }
                //存入db
                if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
                {
                    context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    context.Result = new JsonResult("出错了!已经将错误信息发送给开发人员,开发人员将尽快处理。");
                    context.ExceptionHandled = true;
                }
            }
        }
    }
2.配置服务
在类Startup的方法ConfigureServices中修改
            services.AddMvc(options =>
            {
                options.Filters.Add<FilterException>();
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
依然按##Ctrl+F5##运行:

是我们想要的结果吧?!
附:Filter里面如何判断Controller是否有ApiController属性
        bool isApi = context.Filters.Any(ii => ii.GetType().Name == "ApiControllerAttribute");ASP.NET Core2.2 IExceptionFilter的更多相关文章
- 一步一步带你做WebApi迁移ASP.NET Core2.0
		随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ... 
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
		自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ... 
- ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)
		前言 时间一晃 ASP.NET Core已经迭代到2.1版本了. 迫不及待的的下载了最新的版本,然后生成了一个模版项目来试试水. ...然后就碰到问题了... 我发现..cookie竟然存不进去了.. ... 
- 【4】Asp.Net Core2.2中间件多扩展对应应用
		[前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ... 
- 【3】Asp.Net Core2.2新版管道处理模型
		[前言] 上一篇完成了Asp.Net Core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的MVC没啥差别!但这些都是在组件封装的基础上完成的,在Core里面,其 ... 
- 在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制
		Swashbuckle.AspNetCore3.0 介绍 一个使用 ASP.NET Core 构建的 API 的 Swagger 工具.直接从您的路由,控制器和模型生成漂亮的 API 文档,包括用于探 ... 
- 从ASP.NET Core2.2到3.0你可能会遇到这些问题
		趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识.我们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019.So,就用vs2019+.NET ... 
- 【1】Asp.Net Core2.2从环境配置到应用建立
		作者:Eleven 来源:公众号[软谋net] [前言] .Net Core开源&跨平台,已经肉眼可见将成为.Net平台的未来,在企业招聘需求上已经频频见到,接触到很多公司内部都已经开始尝试C ... 
- 【翻译】asp.net core2.0中的token认证
		原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ... 
随机推荐
- Struts 2 概念介绍
			概念引入 Web层通常使用Servlet+jsp,现在使用Struts2来处理访问服务器请求 Service层 目前使用JavaBean Dao层目前使用Hibernate Spring是一个大的管家 ... 
- fiddler -- 一个强大的抓包工具
			一.fiddler常用功能: 1. Fiddler 是位于客户端和服务器端的http代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有http请求,可以针对特定的http请 ... 
- google搜索引擎爬虫爬网站原理
			google搜索引擎爬虫爬网站原理 一.总结 一句话总结:从几个大站开始,然后开始爬,根据页面中的link,不断爬 从几个大站开始,然后开始爬,根据页面中的link,不断加深爬 1.搜索引擎和数据库检 ... 
- RobotFramework自动化测试框架-Selenium Web自动化(-)-Open Browser和Close Browser
			Selenium出来已经有很多年了,从最初的Selenium1到后来的Selenium2,也变得越来越成熟,而且也已经被很多公司广泛使用.Selenium发展的过程中,分了很多模块,这里我们主要介绍W ... 
- Active Record Query Interface 数据查询接口(界面) 看到第8节。
			http://guides.rubyonrails.org/active_record_querying.html ✅How to find records using a variety of me ... 
- vue.js+webpack在一个简单实例中的使用过程demo
			这里主要记录vue.js+webpack在一个简单实例中的使用过程 说明:本次搭建基于Win 7平台 Node.js 安装官网提供了支持多种平台的的LTS版本下载,我们根据需要来进行下载安装.对于Wi ... 
- xshell6 同时操作多个终端
			当我们使用Xshell的时候,有时候需要同时建立多个会话,连接不同的服务器或者不同的用户,如何同时向所有会话发送同一指令呢?方法如下: 1.依次点击 查看 ---> 撰写 ---> 撰写 ... 
- 洛谷P1439 【模板】最长公共子序列
			题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ... 
- JSP动作标签flush属性值
			在JSP动作标签<jsp:include flush="true"/>,flush属性可以为true或false.flush默认值为false,当把flush属性赋值为 ... 
- 关于HttpSession 和 Hibernate框架中 session异同点的简单解析
			快速理解: HttpSession中的session是一个容器用来盛基于会话机制的信息. 比喻:我把钱放进银行的保险柜里. 解析:我的钱就是我的信息,ID等 银行的保险柜就是session容器. Hi ... 
