ASP.NET Core2.2 IExceptionFilter

catzhou 2019-01-17 原文

ASP.NET Core2.2 IExceptionFilter

用vs2017建立一个ASP.NET Core Web应用程序并选择MVC框架,自动生成了 Startup的类,并配置了错误处理方式:

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

简单讲:

  1. 开发环境,直接在当前页面显示错误
  2. 生产环境:跳转到 /Home/Error页面

而在实际开发和生产过程中,我们需要:

  1. 开发环境,我们有时候会用到ajax调用,需要快速定位错误(比如alert(….))
  2. 生产环境:我们需要把错误信息保存起来,当然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##运行:

是我们想要的结果吧?!

发表于 2019-01-17 16:54 毛毛虫 阅读() 评论() 编辑 收藏

 

版权声明:本文为catzhou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/catzhou/p/10282865.html

ASP.NET Core2.2 IExceptionFilter的更多相关文章

  1. ASP.NET Core Razor页面禁用防伪令牌验证

    在这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证。 Razor页面是A […]...

  2. DDD领域驱动设计:仓储

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD DDD的实体、值对象、聚合根的基类和接口:设计与 […]...

  3. Asp.net Core 经过nginx代理后获取不到真实ip和scheme的问题

    背景 我最近在一个Asp.net core Web 程序在经过nginx代理后 ,总是获取不到用户真实i和sc […]...

  4. [Abp 源码分析]十四、DTO 自动验证

    0.简介 在平时开发 API 接口的时候需要对前端传入的参数进行校验之后才能进入业务逻辑进行处理,否则一旦前端 […]...

  5. 【ABP框架系列学习】模块系统(4)

    0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施。一个模块可以依赖于另外一个模块。通常,程 […]...

  6. GRpc添加客户端的四种方式

    随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同 […]...

  7. 200行代码实现Mini ASP.NET Core

    前言 微软官网关于ASP.NET Core的概念“ASP.NET Core是一个开源和跨平台的框架,用于构建基 […]...

  8. 使用 IIS 在 Windows 上托管 ASP.NET Core2.0

    准备: 操作系统:Windows Server 2008 R2 或更高版本 开发环境:VS2017 第一步:新 […]...

随机推荐

  1. k8s集群搭建笔记(细节有解释哦)

    本文中所有带引号的命令,请手动输入引号,不知道为什么博客里输入引号,总是自动转换成了中文 基本组成 pod:k […]...

  2. Python 中的三元运算(软件测试中运用)

    前言 在java中,有类似于 (condition) ? a :b 这样的语法,表示如果condition 为 […]...

  3. 数据结构算法基础定义

    一、算法的基本定义         1、有穷性   2、确定性:对于每种情况下所应执行的操作,在算法中都有确切 […]...

  4. 一个开源的仓储系统

    http://www.gitwms.com/Home/Welcome...

  5. 判断邮箱的正则表达式

    邮箱@前缀的几种类型: 1、纯数字         123456@qq.com 2、纯字母      zhan […]...

  6. JavaScript 构造函数的继承

    JavaScript 构造函数的继承 在上一篇 文章 中讲述了 JS 对象、构造函数以及原型模式,这篇文章来讨 […]...

  7. ARM、MCU、DSP、FPGA、SOC各是什么?区别是什么?(转) – 张凌001

    ARM、MCU、DSP、FPGA、SOC各是什么?区别是什么?(转) ARM ARM处理器是Acorn计算机有 […]...

  8. 电信数据挖掘之流失管理【转载】

    这几天在长春出差,偶得轻闲。也就想起写写专题应用,前面已写了”开篇”、细分。再谈谈流失 […]...

展开目录

目录导航