流浪のwolf

卷帝

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C# Webapi Filter 过滤器 - 生命周期钩子函数 - Exception Filter 基础

什么是Filter ?

1. 切面编程机制,在 ASP.NET Core 特定的位置执行我们自定义的代码;

2. ASP.NET Core 中的Filter五种类型,Authorization ,filter ,resource filter ,action filter ,exception fitler ,result filter ;

3. 所有的筛选器都有异步和同步两种版本 ;eg:IActionFilter,IAsyncActionFilter ;

 

Action filte讲解:

比如在controller 方法中出现未处理异常 ;文件 

("f:/1.txt");  不存在 ;
复制代码
using Microsoft.AspNetCore.Mvc;

namespace Filter.Controllers
{
    [ApiController]
    [Route("ap/[controller]/[action]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet(Name = "GetWeatherForecast")]
        public string Test1()
        {
            // 文件并不存在会抛出错误
            string s = System.IO.File.ReadAllText("f:/1.txt");  // 读取文件
            return s;
        }

    };
}
复制代码

 对于这种处理可以使用 action filter 劫持并对其做出相应的处理 ;开发环境和生产环境 ;

开发环境要抛出详细的信息,方便我们调试,但是在生产环境,我们只需要抛出 500 服务器出现位置错误即可 ;

 

1. 注册Filter 

    // 注册过滤器
            builder.Services.Configure<MvcOptions>(opt =>
            {
                opt.Filters.Add<MyExceptionFilter>();
            });

2. 具体服务

复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Filter
{
    public class MyExceptionFilter : IAsyncExceptionFilter
    {
        public readonly IWebHostEnvironment hostEnv;

        public MyExceptionFilter(IWebHostEnvironment hostEnv)
        {
            this.hostEnv = hostEnv;
        }

        /// 处理异常
        public Task OnExceptionAsync(ExceptionContext context)
        {
            // context.Exception 代表异常信息对象
            // context.ExceptionHandled 赋值为 true ,下面所有的 filter 就不会在执行 ;
            // context.result 会被输出给客户端
            string msg;
            if (hostEnv.IsDevelopment())
            {
                // 开发环境
                msg = context.Exception.ToString();
            }
            else
            {
                // 生产环境
                msg = "服务器发生未处理异常";
            }
            ObjectResult objResult = new ObjectResult(new { code = 500, message = msg });
            context.Result = objResult;
            context.ExceptionHandled = true;
            return Task.CompletedTask;
        }
    }
}
复制代码

 

posted on   朱龙旭的网络  阅读(166)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
历史上的今天:
2022-10-28 自定义指令 v-imgerror 当图片的 src 资源 无效 就替换 默认的 src 显示图片
2022-10-28 permission 文件 - 后台管理 element-admin 模板 作用-前置路由守卫
2022-10-28 前端 vue.config.js 处理跨域问题 proxy 代理
2022-10-28 手动检查 token 是否过期
2022-10-28 Access to XMLHttpRequest at xxxx from origin xxx has been blocked by CORS policy: No 'Access-Control- Allow-Origin' header is present on the requested resource
点击右上角即可分享
微信分享提示