using Common; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using SMS_Platform.Model.Response; using System; using System.IO; using System.Threading.Tasks; using System.Xml.Serialization; /// <summary> /// 暂时简单封装大型项目用elk efk替代 /// </summary> public class ErrorHandlingMiddleware { private readonly RequestDelegate next; public ErrorHandlingMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { try { await next(context); } catch (Exception ex) { LogHelper.Error(ex.Message, ex); // 日志记录 var statusCode = context.Response.StatusCode; if (ex is ArgumentException) { statusCode = 200; } await HandleExceptionAsync(context, statusCode, ex.Message); } finally { var statusCode = context.Response.StatusCode; var msg = ""; if (statusCode == 401) { msg = "未授权"; } else if (statusCode == 404) { msg = "未找到服务"; } else if (statusCode == 502) { msg = "请求错误"; } else if (statusCode != 200) { msg = "未知错误"; } if (!string.IsNullOrWhiteSpace(msg)) { await HandleExceptionAsync(context, statusCode, msg); } } } /// <summary> /// 对象转为Xml /// </summary> /// <param name="o"></param> /// <returns></returns> private static string Object2XmlString(object o) { StringWriter sw = new StringWriter(); try { XmlSerializer serializer = new XmlSerializer(o.GetType()); serializer.Serialize(sw, o); } catch { } finally { sw.Dispose(); } return sw.ToString(); } private static async Task HandleExceptionAsync(HttpContext context, int statusCode, string msg) { var data = DataResponse.AsError(SMS_Platform.Model.Enums.EnumCode.Invalid_Service_Data, msg); var result = JsonConvert.SerializeObject(data); if (context.Response?.ContentType?.ToLower() == "application/xml") { await context.Response.WriteAsync(Object2XmlString(data)).ConfigureAwait(false); } else { context.Response.ContentType = "application/json;charset=utf-8"; await context.Response.WriteAsync(result).ConfigureAwait(false); } } } public static class ErrorHandlingExtensions { public static IApplicationBuilder UseErrorHandler(this IApplicationBuilder builder) { return builder.UseMiddleware<ErrorHandlingMiddleware>(); } }
app.UseErrorHandler();
原文:https://www.cnblogs.com/chongyao/p/12212821.html