using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.LogHelper; namespace WIDESEAWCS_Core.Middlewares { /// <summary> /// 记录请求和å“åº”æ•°æ® /// </summary> public class ApiLogMiddleware { /// <summary> /// /// </summary> private readonly RequestDelegate _next; private readonly ILogger<ApiLogMiddleware> _logger; public ApiLogMiddleware(RequestDelegate next, ILogger<ApiLogMiddleware> logger) { _next = next; _logger = logger; } //todo public async Task InvokeAsync(HttpContext context) { // è¿‡æ»¤ï¼Œåªæœ‰æŽ¥å£ if (context.Request.Path.Value?.Contains("api") ?? false) { context.Request.EnableBuffering(); Stream originalBody = context.Response.Body; string requestParam = string.Empty; string responseParam = string.Empty; try { (context.RequestServices.GetService(typeof(RequestLogModel)) as RequestLogModel).RequestDate = DateTime.Now; try { // å˜å‚¨è¯·æ±‚æ•°æ® requestParam = RequestDataLog(context); context.Request.Body.Position = 0; } catch { } using MemoryStream ms = new(); context.Response.Body = ms; await _next(context); try { // å˜å‚¨å“åº”æ•°æ® responseParam = ResponseDataLog(context.Response); } catch { } ms.Position = 0; await ms.CopyToAsync(originalBody); if (!(context.Request.Path.Value?.Contains("Get") ?? false)) Logger.Add(requestParam, responseParam); } catch (Exception ex) { // 记录异常 } finally { context.Response.Body = originalBody; } } else { await _next(context); } } private string RequestDataLog(HttpContext context) { var request = context.Request; var sr = new StreamReader(request.Body); object obj = new { QueryString = request.QueryString.ToString(), BodyData = sr.ReadToEndAsync().Result }; string data = JsonConvert.SerializeObject(obj); request.Body.Position = 0; return data; } private string ResponseDataLog(HttpResponse response) { response.Body.Position = 0; using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); string body = stream.ReadToEnd(); response.Body.Position = 0; return body; } } }