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 { /// /// 记录请求和响应数据 /// public class ApiLogMiddleware { /// /// /// private readonly RequestDelegate _next; private readonly ILogger _logger; public ApiLogMiddleware(RequestDelegate next, ILogger 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; } } }