先上代码: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响应码返回相应的内容,当然也可以自定义你想执行的其他操作
代码中已经添加了环境判断,在开发环境中可以直接显示错误内容以便于我们进行调试,当发布到生产环境后才根据我们的响应码执行相关操作