ly/MiddleWare/CustomErrorMiddleware.cs

105 lines
4.0 KiB
C#
Raw Permalink Normal View History

2025-03-22 12:16:22 +00:00
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>();
}
}
}