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>();
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |