• 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##运行:

    是我们想要的结果吧?!

    附:Filter里面如何判断Controller是否有ApiController属性

            bool isApi = context.Filters.Any(ii => ii.GetType().Name == "ApiControllerAttribute");
  • 相关阅读:
    C# 3.0新特性
    WinForm上显示gif动画
    Sql Server中Case函数的使用(上篇)转载
    Jquery的$命名冲突:
    Sql Server中case函数的使用(下篇) 转载
    hdu 2544 2066 1874 2680
    伤感!
    hdu 1999 不可摸数
    hdu 1878欧拉回路
    hdu 2767
  • 原文地址:https://www.cnblogs.com/catzhou/p/10282865.html
Copyright © 2020-2023  润新知