.NetCore 使用自定义Middleware处理HTTP请求 【2019-06-26 21:45更新】

.NetCore 使用自定义Middleware处理HTTP请求

.NETCore Middleware

4502019/1/28 16:23

先上代码:ErrorHandlingMiddleware.cs

using Core.Common;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Threading.Tasks;

namespace Core.WebApplication.API.Models.Middleware
{
    public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        private readonly IHostingEnvironment env;
        private ILogger logger;

        public ErrorHandlingMiddleware(RequestDelegate _next, IHostingEnvironment _env,ILogger<ErrorHandlingMiddleware> logger)
        {
            this.next = _next;
            this.env = _env;
            this.logger = logger;
        }

        public async Task Invoke(HttpContext context)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Middleware发生异常,{(env.IsProduction() ? $"生产环境已交由HandleExceptionAsync处理!" : "非生产环境此异常已被抛出!")}");
                var statusCode = context.Response.StatusCode;
                if (ex is ArgumentException) statusCode = 200;
                //生产环境在此处处理异常,否则抛出异常
                if (env.IsProduction()) await HandleExceptionAsync(context, statusCode, ex.Message + "\r\n" + ex.StackTrace, logger); else throw;
            }
            finally
            {
                if (env.IsProduction())
                {
                    var statusCode = context.Response.StatusCode;
                    var msg = string.Empty;
                    if (statusCode == 401)
                    {
                        msg = "未授权";
                    }
                    else if (statusCode == 403)
                    {
                        msg = "无权访问";
                    }
                    else if (statusCode == 404)
                    {
                        msg = "未找到服务";
                    }
                    else if (statusCode == 500)
                    {
                        msg = "服务端处理错误";
                    }
                    else if (statusCode == 502)
                    {
                        msg = "请求错误";
                    }
                    else if (statusCode != 200)
                    {
                        msg = "未知错误";
                    }
                    if (!string.IsNullOrEmpty(msg))
                    {
                        await HandleExceptionAsync(context, statusCode, msg,logger);
                    }
                }
            }
        }
        //异常错误信息捕获,将错误信息用Json方式返回
        private static Task HandleExceptionAsync(HttpContext context, int statusCode, string msg, ILogger logger)
        {
            var result = JsonConvert.SerializeObject(new Result { success = false, msg = msg, statusCode = statusCode });
            try
            {
                context.Response.ContentType = "application/json;charset=utf-8";
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "异常捕获主体内发生捕获异常");
                context.Response.Clear();
            }
            return context.Response.WriteAsync(result);
        }
    }
    //扩展方法
    public static class ErrorHandlingExtensions
    {
        public static IApplicationBuilder UseErrorHandling(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ErrorHandlingMiddleware>();
        }
    }
}


使用方法:

在Startup.cs文件的Configure方法中添加一行

//添加异常处理Middleware
app.UseErrorHandling();


这样就可以根据HTTP响应码返回相应的内容,当然也可以自定义你想执行的其他操作


代码中已经添加了环境判断,在开发环境中可以直接显示错误内容以便于我们进行调试,当发布到生产环境后才根据我们的响应码执行相关操作

上一篇 下一篇
music cover

歌曲名称

作者

00:00/00:00

歌名 歌手 时长