From 982b21b945c3621e24c3e699e48a95a161bb192a Mon Sep 17 00:00:00 2001 From: hwh <332078369@qq.com> Date: 星期四, 11 七月 2024 11:12:52 +0800 Subject: [PATCH] 全局返回和异常处理 --- /dev/null | 67 ---------------- Wms/Utility/Filter/CustomerExceptionFilter.cs | 54 +++++++++++++ HTML/views/SystemSettings/Job.html | 2 Wms/Utility/Extension/ApiResponseActionFilter.cs | 37 +++++---- Wms/Utility/Extension/ServiceCollectionExtensions.cs | 28 +++---- Wms/Wms/Controllers/JobController.cs | 2 HTML/views/SystemSettings/JobForm.html | 6 + Wms/Wms/Controllers/BllTaskController.cs | 1 Wms/Wms/Startup.cs | 3 9 files changed, 93 insertions(+), 107 deletions(-) diff --git a/HTML/views/SystemSettings/Job.html b/HTML/views/SystemSettings/Job.html index 4589fe9..d26a50f 100644 --- a/HTML/views/SystemSettings/Job.html +++ b/HTML/views/SystemSettings/Job.html @@ -329,7 +329,7 @@ }); //娣诲姞 form.on('submit(LAY-app-contlist-add)', function (obj) { - objRowsData = {}; + objRowsData = null; layer.open({ type: 2, title: '娣诲姞瀹氭椂浠诲姟淇℃伅', diff --git a/HTML/views/SystemSettings/JobForm.html b/HTML/views/SystemSettings/JobForm.html index 196337c..97707dc 100644 --- a/HTML/views/SystemSettings/JobForm.html +++ b/HTML/views/SystemSettings/JobForm.html @@ -210,8 +210,10 @@ obj.field.BeginTime = convertToDateTimeOffset(obj.field.BeginTime); obj.field.EndTime = convertToDateTimeOffset(obj.field.EndTime); obj.field.IntervalMilliseconds = parseInt(obj.field.IntervalMilliseconds); - - obj.field.RequestType = parseInt(obj.field.RequestType); + if (obj.field.RequestType) + obj.field.RequestType = parseInt(obj.field.RequestType); + else + obj.field.RequestType = 0 var url = "/Job/AddJob"; var param; if (objRowsData) { diff --git a/Wms/Utility/Extension/ApiResponseActionFilter.cs b/Wms/Utility/Extension/ApiResponseActionFilter.cs index 5802b58..d5afddd 100644 --- a/Wms/Utility/Extension/ApiResponseActionFilter.cs +++ b/Wms/Utility/Extension/ApiResponseActionFilter.cs @@ -1,50 +1,52 @@ -锘縰sing Microsoft.AspNetCore.Http; +锘縰sing Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using NetTaste; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Threading.Tasks; using Utility.Entity; -using Utility.Extension; namespace Utility { - public class ApiResponseActionFilter : IAsyncActionFilter + public class ApiResponseActionFilter : IAsyncResultFilter { - public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { - // 鍦ㄦ墽琛屽姩浣滀箣鍓嶇殑閫昏緫 - var resultContext = await next(); // 鎵ц鍔ㄤ綔鏂规硶骞惰幏鍙栨墽琛岀粨鏋� - - // 鍦ㄦ墽琛屽姩浣滀箣鍚庣殑閫昏緫 - if (resultContext.Result is ObjectResult objectResult) + if (context.Result is ObjectResult objectResult) { + if (objectResult.StatusCode != null) + { + await next(); + return; + } ApiResponse<object> apiResponse; if (objectResult.Value is SqlSugarPagedList) { apiResponse = new ApiResponse<object>( - context.HttpContext.Response.StatusCode == 200 ? 0 : 1, - context.HttpContext.Response.StatusCode == 200 ? "璇锋眰鎴愬姛" : "閿欒", + 0, "璇锋眰鎴愬姛", ((SqlSugarPagedList)objectResult.Value).Items, ((SqlSugarPagedList)objectResult.Value).Total); } else { apiResponse = new ApiResponse<object>( - context.HttpContext.Response.StatusCode == 200 ? 0 : 1, - context.HttpContext.Response.StatusCode == 200 ? "璇锋眰鎴愬姛" : "閿欒", + 0, "璇锋眰鎴愬姛", objectResult.Value); } var json = JsonConvert.SerializeObject(apiResponse); context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.ContentLength = Encoding.UTF8.GetByteCount(json); - await context.HttpContext.Response.WriteAsync(json); + context.Result = new ObjectResult(apiResponse); + //await context.HttpContext.Response.WriteAsync(json); + } - if (resultContext.Result is EmptyResult) + else if (context.Result is EmptyResult) { var apiResponse = new ApiResponse<object>( context.HttpContext.Response.StatusCode == 200 ? 0 : 1, @@ -55,9 +57,10 @@ var json = JsonConvert.SerializeObject(apiResponse); context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.ContentLength = Encoding.UTF8.GetByteCount(json); - - await context.HttpContext.Response.WriteAsync(json); + context.Result = new ObjectResult(apiResponse); + //await context.HttpContext.Response.WriteAsync(json); } + await next(); } } } diff --git a/Wms/Utility/Extension/ApiResponseMiddleware.cs b/Wms/Utility/Extension/ApiResponseMiddleware.cs deleted file mode 100644 index 745862c..0000000 --- a/Wms/Utility/Extension/ApiResponseMiddleware.cs +++ /dev/null @@ -1,97 +0,0 @@ -锘縰sing Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Utility.Entity; - -namespace Utility.Extension -{ - public class ApiResponseMiddleware : IMiddleware - { - public ApiResponseMiddleware() - { - - } - - public async Task InvokeAsync(HttpContext context, RequestDelegate next) - { - if (ShouldApplyApiResponseMiddleware(context)) - { - // 鎹曡幏鍝嶅簲 - var originalBodyStream = context.Response.Body; - - using (var responseBody = new MemoryStream()) - { - context.Response.Body = responseBody; - - await next(context); - // 璇诲彇鍝嶅簲鍐呭 - context.Response.Body.Seek(0, SeekOrigin.Begin); - var body = await new StreamReader(context.Response.Body).ReadToEndAsync(); - context.Response.Body.Seek(0, SeekOrigin.Begin); - - // 鍙嶅簭鍒楀寲鍝嶅簲鍐呭 - object data = null; - if (!string.IsNullOrEmpty(body)) - { - try - { - data = JsonConvert.DeserializeObject<object>(body); - } - catch (JsonException) - { - // 濡傛灉鍝嶅簲涓嶆槸鏈夋晥鐨凧SON鏍煎紡锛岀洿鎺ュ皢鍏朵綔涓哄瓧绗︿覆鏁版嵁澶勭悊 - data = body; - } - } - - var apiResponse = new ApiResponse<object>( - code: context.Response.StatusCode == StatusCodes.Status200OK ? (int)ResponseEnum.Sucess : (int)ResponseEnum.Fail, - message: context.Response.StatusCode == StatusCodes.Status200OK ? "璇锋眰鎴愬姛" : "", - data: data - ); - - var json = JsonConvert.SerializeObject(apiResponse); - context.Response.ContentType = "application/json"; - context.Response.ContentLength = Encoding.UTF8.GetByteCount(json); - - context.Response.Body = originalBodyStream; - await context.Response.WriteAsync(json); - } - } - else - { - await next(context); - } - } - private bool ShouldApplyApiResponseMiddleware(HttpContext context) - { - // 鑾峰彇褰撳墠澶勭悊璇锋眰鐨勬帶鍒跺櫒淇℃伅 - var controllerActionDescriptor = context.GetEndpoint()?.Metadata.GetMetadata<ControllerActionDescriptor>(); - if (controllerActionDescriptor != null) - { - // 鍒ゆ柇鎺у埗鍣ㄦ槸鍚﹀甫鏈� ResponseAttribute 鐗规�� - return controllerActionDescriptor.ControllerTypeInfo.IsDefined(typeof(UnifyResponseAttribute), inherit: true); - } - return false; - } - } - public static class ApiResponse - { - public static void UseApiResponse(this IApplicationBuilder app) - { - app.UseMiddleware<ApiResponseMiddleware>(); - } - } - - public class UnifyResponseAttribute : Attribute - { - - } -} diff --git a/Wms/Utility/Extension/LogExtends.cs b/Wms/Utility/Extension/LogExtends.cs deleted file mode 100644 index de01c02..0000000 --- a/Wms/Utility/Extension/LogExtends.cs +++ /dev/null @@ -1,75 +0,0 @@ -锘縰sing Serilog.Events; -using Serilog; -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace Wms -{ - public static class LogExtends - { - //const string infoPath = "Logs/Information.log"; - //const string warnPath = "Logs/Warning.log"; - //const string errorPath = "Logs/Error.log"; - //const string fatalPath = "Logs/Fatal.log"; - //const string template = "鏃堕棿: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}鏉ユ簮: {SourceContext}{NewLine}鍐呭: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}"; - - //// 鍙互灏嗘棩蹇楄緭鍑哄埌鎺у埗鍙般�佹枃浠躲�佹暟鎹簱銆丒S绛� - //public static void AddSerilog(this IServiceCollection c) - //{ - // Log.Logger = new LoggerConfiguration() - // .MinimumLevel.Information() - // .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 鎺掗櫎Dotnet鑷甫鐨勬棩蹇� - // .Enrich.FromLogContext() - // .WriteTo.Console(outputTemplate: template) - // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Information).WriteTo.Async(congfig => congfig.File( - // infoPath, - // rollingInterval: RollingInterval.Day, - // fileSizeLimitBytes: 1024 * 1024 * 10, //榛樿1GB - // retainedFileCountLimit: 100, //淇濈暀鏈�杩戝灏戜釜鏂囦欢,榛樿31涓� - // rollOnFileSizeLimit: true, //瓒呰繃鏂囦欢澶у皬鏃�,鑷姩鍒涘缓鏂版枃浠� - // shared: true, - // outputTemplate: template) - // )) - - // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Warning).WriteTo.Async(congfig => congfig.File( - // warnPath, - // rollingInterval: RollingInterval.Day, - // fileSizeLimitBytes: 1024 * 1024 * 10, - // retainedFileCountLimit: 100, - // rollOnFileSizeLimit: true, - // shared: true, - // outputTemplate: template) - // )) - - // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Error).WriteTo.Async(congfig => congfig.File( - // errorPath, - // rollingInterval: RollingInterval.Day, - // fileSizeLimitBytes: 1024 * 1024 * 10, - // retainedFileCountLimit: 100, - // rollOnFileSizeLimit: true, - // shared: true, - // outputTemplate: template) - // )) - - // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Fatal).WriteTo.Async(congfig => congfig.File( - // fatalPath, - // rollingInterval: RollingInterval.Day, - // fileSizeLimitBytes: 1024 * 1024 * 10, - // retainedFileCountLimit: 100, - // rollOnFileSizeLimit: true, - // shared: true, - // outputTemplate: template) - // )).CreateLogger(); - - // // 娉ㄥ叆鍒板鍣� - // c.AddLogging(opt => - // { - // opt.ClearProviders(); - // opt.AddSerilog(dispose: true); - // }); - //} - } -} diff --git a/Wms/Utility/Extension/ServiceCollectionExtensions.cs b/Wms/Utility/Extension/ServiceCollectionExtensions.cs index 2669a82..0abe4ed 100644 --- a/Wms/Utility/Extension/ServiceCollectionExtensions.cs +++ b/Wms/Utility/Extension/ServiceCollectionExtensions.cs @@ -24,19 +24,23 @@ // 鍒涘缓Serilog璁板綍鏃ュ織 Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() - .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 鎺掗櫎Dotnet鑷甫鐨勬棩蹇� - //.MinimumLevel.Verbose() - //.MinimumLevel.Override("System", LogEventLevel.Debug) - //.MinimumLevel.Override("Microsoft", LogEventLevel.Debug) - //.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error) - //.MinimumLevel.Override("Microsoft.AspNetCore.Cors.Infrastructure.CorsService", LogEventLevel.Error) - //.MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Error) - //.MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Error) + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Fatal) + .MinimumLevel.Override("Quartz", LogEventLevel.Warning) + .MinimumLevel.Override("Serilog", LogEventLevel.Information) // 鍏ㄩ儴鏃ュ織鍐欏叆鍒癈onsole .WriteTo.Console() .WriteTo.Async(c => c.Console( theme: AnsiConsoleTheme.Literate, outputTemplate: template)) + // Debug鏃ュ織鍐欏叆鍒版枃浠� + //.WriteTo.Async(c => c.File( + // path: "Logs/Debug_.txt", + // rollingInterval: RollingInterval.Day, + // fileSizeLimitBytes: 1024 * 1024 * 10, + // retainedFileCountLimit: 100, + // outputTemplate: template, + // restrictedToMinimumLevel: LogEventLevel.Debug)) // Information鏃ュ織鍐欏叆鍒版枃浠� .WriteTo.Async(c => c.File( path: "Logs/Information_.txt", @@ -45,14 +49,6 @@ retainedFileCountLimit: 100, outputTemplate: template, restrictedToMinimumLevel: LogEventLevel.Information)) - // Debug鏃ュ織鍐欏叆鍒版枃浠� - .WriteTo.Async(c => c.File( - path: "Logs/Verbose.txt", - rollingInterval: RollingInterval.Day, - fileSizeLimitBytes: 1024 * 1024 * 10, - retainedFileCountLimit: 100, - outputTemplate: template, - restrictedToMinimumLevel: LogEventLevel.Verbose)) // Warning鏃ュ織鍐欏叆鍒版枃浠� .WriteTo.Async(c => c.File( path: "Logs/Warning_.txt", diff --git a/Wms/Utility/Filter/CustomerExceptionFilter.cs b/Wms/Utility/Filter/CustomerExceptionFilter.cs new file mode 100644 index 0000000..2c2c54d --- /dev/null +++ b/Wms/Utility/Filter/CustomerExceptionFilter.cs @@ -0,0 +1,54 @@ +锘縰sing Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Utility.Entity; + +namespace Utility +{ + public class CustomerExceptionFilter : IAsyncExceptionFilter + { + /// <summary> + /// 閲嶅啓OnExceptionAsync鏂规硶锛屽畾涔夎嚜宸辩殑澶勭悊閫昏緫 + /// </summary> + /// <param name="context"></param> + /// <returns></returns> + private readonly ILogger<CustomerExceptionFilter> _logger; + public CustomerExceptionFilter(ILogger<CustomerExceptionFilter> logger) + { + _logger = logger; + } + public Task OnExceptionAsync(ExceptionContext context) + { + // 濡傛灉寮傚父娌℃湁琚鐞嗗垯杩涜澶勭悊 + if (context.ExceptionHandled == false) + { + var result = "绯荤粺寮傚父锛岃鑱旂郴绠$悊鍛�"; + if (context.Exception is AppFriendlyException) + result = context.Exception.Message; + var apiResponse = new ApiResponse<object>( + code: (int)ResponseEnum.Error, + message: result, + data: result + ); + _logger.LogError(context.Exception, context.Exception.Message); + context.Result = new ContentResult + { + // 杩斿洖鐘舵�佺爜璁剧疆涓�200锛岃〃绀烘垚鍔� + StatusCode = StatusCodes.Status200OK, + // 璁剧疆杩斿洖鏍煎紡 + ContentType = "application/json;charset=utf-8", + Content = JsonConvert.SerializeObject(apiResponse) + }; + } + // 璁剧疆涓簍rue锛岃〃绀哄紓甯稿凡缁忚澶勭悊浜� + context.ExceptionHandled = true; + return Task.CompletedTask; + } + } +} diff --git a/Wms/Utility/Filter/CustomerExceptionMiddleware.cs b/Wms/Utility/Filter/CustomerExceptionMiddleware.cs deleted file mode 100644 index 33fe7af..0000000 --- a/Wms/Utility/Filter/CustomerExceptionMiddleware.cs +++ /dev/null @@ -1,67 +0,0 @@ -锘縰sing Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using System.Threading.Tasks; -using System; -using System.Text.Json; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Logging; -using Utility.Entity; -using Newtonsoft.Json; -using System.Text; - -namespace Utility -{ - public class CustomerExceptionMiddleware - { - private readonly RequestDelegate _next; - private readonly ILogger<CustomerExceptionMiddleware> _logger; - - public CustomerExceptionMiddleware(RequestDelegate next, ILogger<CustomerExceptionMiddleware> logger) - { - _next = next; - _logger = logger; - } - - public async Task Invoke(HttpContext context) - { - try - { - await _next(context); - } - catch (Exception ex) - { - _logger.LogError(ex, ex.Message); - context.Response.ContentType = "application/json"; - context.Response.StatusCode = StatusCodes.Status500InternalServerError; - var result = "绯荤粺寮傚父锛岃鑱旂郴绠$悊鍛�"; - if (ex is AppFriendlyException) - result = ex.Message; - var apiResponse = new ApiResponse<object>( - code: (int)ResponseEnum.Error, - message: result, - data: result - ); - var json = JsonConvert.SerializeObject(apiResponse); - context.Response.ContentType = "application/json"; - context.Response.ContentLength = Encoding.UTF8.GetByteCount(json); - await context.Response.WriteAsync(json); - } - } - } - - /// <summary> - /// 闈欐�佺被 - /// </summary> - public static class ExceptionMiddlewareExtension - { - /// <summary> - /// 闈欐�佹柟娉� - /// </summary> - /// <param name="app">瑕佽繘琛屾墿灞曠殑绫诲瀷</param> - public static void UseExceptionMiddleware(this IApplicationBuilder app) - { - app.UseMiddleware(typeof(CustomerExceptionMiddleware)); - } - } -} - diff --git a/Wms/Wms/Controllers/BllTaskController.cs b/Wms/Wms/Controllers/BllTaskController.cs index 7e95e77..39dea63 100644 --- a/Wms/Wms/Controllers/BllTaskController.cs +++ b/Wms/Wms/Controllers/BllTaskController.cs @@ -8,7 +8,6 @@ using System.Security.Claims; using System.Threading.Tasks; using Utility; -using Utility.Extension; using Wms.Tools; using WMS.IBLL.IBllTaskServer; diff --git a/Wms/Wms/Controllers/JobController.cs b/Wms/Wms/Controllers/JobController.cs index 6b1f28f..f35990d 100644 --- a/Wms/Wms/Controllers/JobController.cs +++ b/Wms/Wms/Controllers/JobController.cs @@ -45,7 +45,7 @@ { return "涓嶅厑璁歌繃棰戠箒鎵ц浠诲姟锛�"; } - + throw Oops.Bah("娴嬭瘯寮傚父"); return await scheduler.AddScheduleJobAsync(entity); } diff --git a/Wms/Wms/Startup.cs b/Wms/Wms/Startup.cs index 694afba..8b90be5 100644 --- a/Wms/Wms/Startup.cs +++ b/Wms/Wms/Startup.cs @@ -17,7 +17,6 @@ using Serilog; using Autofac.Core; using Utility; -using Utility.Extension; using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Http; using SqlSugar; @@ -48,6 +47,7 @@ services.AddControllers(options => { options.Filters.Add<RequestAuditLogFilter>(); + options.Filters.Add<CustomerExceptionFilter>(); }) .AddJsonOptions(options => { @@ -164,7 +164,6 @@ } //全局返回规范 //app.UseApiResponse();//弃用 改用Filter [ServiceFilter(typeof(ApiResponseActionFilter))] - app.UseExceptionMiddleware(); //使用Serilog记录请求日志 app.UseSerilogRequestLogging(); -- Gitblit v1.8.0