105 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using LY.App.Service;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace LY.App.MiddleWare
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class CustomErrorMiddleware
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private readonly RequestDelegate _next;
							 | 
						|||
| 
								 | 
							
								        private string body = string.Empty;
							 | 
						|||
| 
								 | 
							
								        private readonly LogService _logger;
							 | 
						|||
| 
								 | 
							
								        public CustomErrorMiddleware(RequestDelegate requestDelegate, LogService logger)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            this._next = requestDelegate;
							 | 
						|||
| 
								 | 
							
								            _logger = logger;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public async Task Invoke(HttpContext context, IConfiguration configuration)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // Check if the request is a form post with a file
							 | 
						|||
| 
								 | 
							
								                if (context.Request.HasFormContentType && context.Request.Form.Files.Count > 0)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    foreach (var file in context.Request.Form.Files)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        // Log file information
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        //_logger.LogInformation($"File uploaded - Name: {file.Name}, " +
							 | 
						|||
| 
								 | 
							
								                        //       $"FileName: {file.FileName}, " +
							 | 
						|||
| 
								 | 
							
								                        //       $"ContentType: {file.ContentType}, " +
							 | 
						|||
| 
								 | 
							
								                        //       $"Size: {file.Length} bytes");
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    context.Request.EnableBuffering();
							 | 
						|||
| 
								 | 
							
								                    using (var reader = new StreamReader(context.Request.Body,
							 | 
						|||
| 
								 | 
							
								                        encoding: Encoding.UTF8,
							 | 
						|||
| 
								 | 
							
								                        detectEncodingFromByteOrderMarks: false,
							 | 
						|||
| 
								 | 
							
								                        leaveOpen: true))
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        body = await reader.ReadToEndAsync();
							 | 
						|||
| 
								 | 
							
								                        // Do some processing with body…
							 | 
						|||
| 
								 | 
							
								                        // Reset the request body stream position so the next middleware can read it
							 | 
						|||
| 
								 | 
							
								                        context.Request.Body.Position = 0;
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                await _next.Invoke(context);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                await HandleError(context, ex, configuration);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 错误信息处理方法
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="context"></param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="ex"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        private async Task HandleError(HttpContext context, Exception ex, IConfiguration configuration)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            string pars = string.Empty;
							 | 
						|||
| 
								 | 
							
								            var method = context.Request.Method.ToUpper();
							 | 
						|||
| 
								 | 
							
								            var enable = configuration.GetSection("log2db").Value.ToLower();
							 | 
						|||
| 
								 | 
							
								            if (enable == "true")
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                switch (method)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    case "GET":
							 | 
						|||
| 
								 | 
							
								                        pars = context.Request.QueryString.ToString();
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                    case "POST":
							 | 
						|||
| 
								 | 
							
								                        //   var requestReader = new StreamReader(context.Request.Body);
							 | 
						|||
| 
								 | 
							
								                        // pars = await requestReader.ReadToEndAsync();
							 | 
						|||
| 
								 | 
							
								                        pars = body;
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                    default:
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                await _logger.AddLog(new Model.AddLog()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    StackTrace = ex.StackTrace.Length > 1000 ? ex.StackTrace.Substring(0, 999) : ex.StackTrace,
							 | 
						|||
| 
								 | 
							
								                    Message = ex.Message,
							 | 
						|||
| 
								 | 
							
								                    Parameters = pars,
							 | 
						|||
| 
								 | 
							
								                    url = context.Request.Path,
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            Console.WriteLine($"错误消息:{ex.Message}错误追踪{ex.StackTrace}");
							 | 
						|||
| 
								 | 
							
								            context.Response.StatusCode = 500;
							 | 
						|||
| 
								 | 
							
								            context.Response.ContentType = "text/json;charset=utf-8;";
							 | 
						|||
| 
								 | 
							
								            await context.Response.WriteAsJsonAsync(new { code = 1, msg = $"抱歉,服务端出错了,错误消息:{ex.Message}", data = "" });
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    public static class RequestCultureMiddlewareExtensions
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        public static IApplicationBuilder UseCustomErrorMiddleware(
							 | 
						|||
| 
								 | 
							
								            this IApplicationBuilder builder)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return builder.UseMiddleware<CustomErrorMiddleware>();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |