首页 > 其他分享 >巧用ExceptionFilter筛选器

巧用ExceptionFilter筛选器

时间:2023-01-28 22:44:05浏览次数:47  
标签:AspNetCore Cache ExceptionFilter Mvc context using 筛选 Microsoft 巧用

异常筛选器

异常筛选器怎么使用我就不说了。

主要记录两点:

1、如何在开发环境和生产环境提示不同的异常信息?
		因为我们知道,项目在开发期间是需要将异常完整信息展示方便开发人员排错,而正式上线时候就不应该完全展现了,因为太详细容易被恶意攻击。(利用IWebHostEnvironment获取环境)

2、存在多个异常筛选器如何排序?
	  虽然一个项目使用多个异常筛选器不太可能,但还是值得记录一下。	

第一点

1、创建异常类

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Cache.Api
{
    public class MyExceptionFilter : IAsyncExceptionFilter
    {
        //获取当前环境
        private readonly IWebHostEnvironment _hostEnvironment;

        public MyExceptionFilter(IWebHostEnvironment hostEnvironment)
        {
            _hostEnvironment = hostEnvironment;
        }

        public Task OnExceptionAsync(ExceptionContext context)
        {

            string msg;
            if(_hostEnvironment.IsDevelopment())
            {
                msg = context.Exception.ToString();
            }
            else
            {
                msg = "服务器端发生未处理异常";
            }

            ObjectResult objectResult = new ObjectResult(new {code = 500,message = msg});
            context.Result = objectResult;
            
            //这个设置true,后面再细说
            context.ExceptionHandled = false;

            return Task.CompletedTask;
        }
    }
}

2、在Progame.cs中注入服务

using Cache.Api;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<MvcOptions>(opt=>{
    opt.Filters.Add<MyExceptionFilter>();
});

var app = builder.Build();

3、查看launchsettings.json文件此时ASPNETCORE_ENVIRONMENT都为Development

{
  "profiles": {
    "Cache.Api": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5024",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

4、控制器模拟异常

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
namespace Cache.Api.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet("GetException")]
    public dynamic GetException()
    {
        string n = null;
        return n.ToString();
    }
}

5、终端运行并请求接口(注意:当使用终端运行程序时候获取的环境是launchsettings.json文件profiles中Development值,当使用IIS Express则获取IIS Express的Development值)

PS C:\Users\张跑跑\Desktop\net\Cache\Cache.Api> dotnet run
正在生成...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5024
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: nononoDevelopment
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\张跑跑\Desktop\net\Cache\Cache.Api\

可以看到在Development情况下走的是 msg = context.Exception.ToString();

修改Development后走的是 msg = "服务器端发生未处理异常";

  "profiles": {
    "Cache.Api": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5024",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "nonononoDevelopment"
      }
    }

成功!



第二点

1、我们创建两个异常类,它们context.ExceptionHandled分别为true,false

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Cache.Api
{
    public class MyExceptionFilter2 : IAsyncExceptionFilter
    {
        public Task OnExceptionAsync(ExceptionContext context)
        {

            context.Result = new ObjectResult(new 
            {
                code = 500,
                message = "我先处理"
            });

            context.ExceptionHandled = false;

            return Task.CompletedTask;
        }   
    }
}
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Cache.Api
{
    public class MyExceptionFilter3 : IAsyncExceptionFilter
    {
        public Task OnExceptionAsync(ExceptionContext context)
        {

            context.Result = new ObjectResult(new 
            {
                code = 500,
                message = "我为什么还要处理啊!"
            });

            context.ExceptionHandled = true;

            return Task.CompletedTask;
        }   
    }
}

2、然后注册这两个,注意把为false的先注册

using Cache.Api;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<MvcOptions>(opt=>{
    opt.Filters.Add<MyExceptionFilter2>();
    opt.Filters.Add<MyExceptionFilter3>();
});

var app = builder.Build();

3、浏览器查看会发现异常居然一直走到第二个异常上

这是因为context.ExceptionHandled = false;表示我处理的异常还将传给在我后面注册的异常筛选器。

4、现在我们将值改为true

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Cache.Api
{
    public class MyExceptionFilter2 : IAsyncExceptionFilter
    {
        public Task OnExceptionAsync(ExceptionContext context)
        {

            context.Result = new ObjectResult(new 
            {
                code = 500,
                message = "我先处理"
            });

            context.ExceptionHandled = true;

            return Task.CompletedTask;
        }   
    }
}

成功!

标签:AspNetCore,Cache,ExceptionFilter,Mvc,context,using,筛选,Microsoft,巧用
From: https://www.cnblogs.com/long-live/p/sxq.html

相关文章

  • 【笔记】gitlab+openldap使用memberof筛选登录用户
    这几天在搞kerberos+nfs4没搞成之前搞了个openldap实现了分散控制集中管理(不是DCS...)gitlab和nexus也支持ldap虽然都不咋好用但是在搞gitlab的时候发现memberOf这个玩......
  • 数据分析02_数据筛选
     本次学习数据以Titanic为例,链接:https://www.kaggle.com/competitions/titanic/data本次学习工具:jupyter本次学习目录文件:数据分析主要使用python的numpy和pandas库......
  • jQuery复习(CSS模块/筛选模块/文档处理(CUD)模块/事件模块)
    视频CSS模块style样式css(styleName):根据样式名得到对应的值css(styleName,value):设置一个样式css({多个样式对}):设置多个样式位置坐标offset():读/......
  • java 巧用标识符
    很多时候,巧用标识会很大的减少代码量和厘清代码逻辑;比如下面,这里的entName和code都有可能为空,也可能都不为空,但是当两entName都不为空且相等,或者当两code都不为空且相等时,才......
  • jQuery对象的筛选(过滤)
    视频<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>15_筛选_过滤</title></head><body><ul><li>AAAAA</li><lititle="hello"class="box......
  • jQuery对象的筛选(查找)
    视频<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>16_筛选_查找孩子-父母-兄弟标签</title></head><body><divid="div1"class="box"title="o......
  • java中两个list集合取并集、交集和差集&对list数据进行筛选
    java中两个list集合取并集、交集和差集List<String>list1=newArrayList<>();List<String>list2=newArrayList<>();list1.add("A");list1.add("C");list1.add......
  • python 操作Excel表格 (筛选一个表格相比另一个表格缺少的元素)
    一个备忘录,几乎没怎么用过excel,也不知道它是不是自带这个功能了,大致需求就是,一个表格里有全体学生的姓名,另外一个表格里有及格的学生的姓名,但是想要找出不及格的学生的姓名......
  • Q:oracle 日期筛选
    一、oraclewhere条件日期筛选时间标识显示格式:'MM/DD/YYYYHH24:MI:SS'两种方法:tochar和todate二、示例1、to_date:select*frompt_esb_process_logwherep_date......
  • dataframe数据结构之数据的筛选
    导入模块importpandasaspd案例数据my_dict={'姓名':['张三','李四','王二','六月','北海'],'年龄':[23,27,26,22,18],'性别':['男......