zoukankan      html  css  js  c++  java
  • CoreApi 3.1

    一、过滤器方式

    先定义一个异常过滤器

        /// <summary>
        /// 异常过滤器
        /// </summary>
        public class ExceptionFilter : IExceptionFilter
        {
            /// <summary>
            /// 发生异常时进入
            /// </summary>
            /// <param name="context"></param>
            public void OnException(ExceptionContext context)
            {
                if (context.ExceptionHandled == false)
                {
                    context.Result = new ContentResult
                    {
                        Content = context.Exception.Message,//这里是把异常输出,也可以不输出,也可以输出JSON结构的字符串。
                        StatusCode = StatusCodes.Status200OK,
                        ContentType = "text/html;charset=utf-8"
                    };
                }
                context.ExceptionHandled = true;
    
                //写入日志,或者其它操作
                
            }
        }

    再API控制器使用过滤器

    [TypeFilter(typeof(ExceptionFilter))]//这里使用自定义过滤器
    [ApiController]
    public class MyController:ControllerBase
    {
        //.....          
    }

    二、配置方式

    在 Startup.cs 中的, Configure 配置中

            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                //异常配置文件写法
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler(config =>
                    {
                        config.Run(async context =>
                        {
                            context.Response.StatusCode = 500;
                            context.Response.ContentType = "application/json";
    
                            var error = context.Features.Get<IExceptionHandlerFeature>();
                            if (error != null)
                            {
                                var ex = error.Error;
    
                                //输出异常内容,也可以不输出,也可以输出JSON结构的字符串
                                await context.Response.WriteAsync(ex.Message);
                            }
                        });
                    });
                }
            }

    三、中间件方式

    先定义一个异常中间件

        public class CustomExceptionMiddleware
        {
            private readonly RequestDelegate _next;
            //private readonly ILogger<CustomExceptionMiddleware> _logger;
            public CustomExceptionMiddleware(RequestDelegate next)
            {
                _next = next;
            }
    
            public async Task Invoke(HttpContext httpContext)
            {
                try
                {
                    await _next(httpContext);
                }
                catch (Exception ex)
                {
                    //写入日志或者其它操作
                    //log
                    await HandleExceptionAsync(httpContext, ex);
                }
            }
    
            private async Task HandleExceptionAsync(HttpContext httpContext, Exception ex)
            {
                httpContext.Response.StatusCode = StatusCodes.Status200OK;
                httpContext.Response.ContentType = "application/json;charset=utf-8";
                //输出异常内容
                await httpContext.Response.WriteAsync(ex.Message);
                //如果不输出,则需要下面这句
                //return Task.CompletedTask;
            }
        }

     再定义一个扩展类

        public static class CustomExceptionMiddlewareExtensions
        {
            public static IApplicationBuilder UseCustomExceptionMiddleware(this IApplicationBuilder builder)
            {
                return builder.UseMiddleware<CustomExceptionMiddleware>();
            }
        }

    在 Startup 的 Configure 中配置

                //异常配置文件写法
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseCustomExceptionMiddleware();
                }

     也可以不判断开发环境

  • 相关阅读:
    Android-Universal-Image-Loader学习笔记(两)--LruDiscCache
    linux 多个源文件在编译时会产生一个目标文件
    springMVC 获取本地项目路径 及后整理上传文件的方法
    Cf 444C DZY Loves Colors(段树)
    什么是EF, 和 Entity Framework Demo简单构建一个良好的发展环境
    Mac下一个/usr/include失踪
    ArcGIS 10 破解安装(win7 64位)
    Android ProgressBar 反向进度条/进度条从右到左走
    Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
    poj 3273 Monthly Expense (二分)
  • 原文地址:https://www.cnblogs.com/myfqm/p/13814201.html
Copyright © 2011-2022 走看看