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 WIDESEA_Core.Helper; using WIDESEA_Core.LogHelper; namespace WIDESEA_Core.Middlewares { /// /// 记录请求和响应数据 /// public class ApiLogMiddleware { /// /// /// private readonly RequestDelegate _next; public ApiLogMiddleware(RequestDelegate next) { _next = next; } //todo public async Task InvokeAsync(HttpContext context) { // 过滤,只有接口 if (context.Request.Path.Value?.Contains("api") ?? false) { context.Request.EnableBuffering(); Stream originalBody = context.Response.Body; try { try { // 存储请求数据 await RequestDataLog(context); context.Request.Body.Position = 0; } catch { } using MemoryStream ms = new(); context.Response.Body = ms; await _next(context); try { // 存储响应数据 ResponseDataLog(context.Response, ms); } catch { } ms.Position = 0; await ms.CopyToAsync(originalBody); } catch (Exception ex) { // 记录异常 } finally { context.Response.Body = originalBody; } } else { await _next(context); } } private async Task RequestDataLog(HttpContext context) { var request = context.Request; var sr = new StreamReader(request.Body); //long length = request.Body.Length; RequestLogInfo requestResponse = new RequestLogInfo() { Path = request.Path, QueryString = request.QueryString.ToString(), BodyData = await sr.ReadToEndAsync() }; var content = JsonConvert.SerializeObject(requestResponse); if (!string.IsNullOrEmpty(content)) { LogLock.OutLogAOP("接口日志", new string[] { "请求数据 - 请求数据类型:" + requestResponse.GetType().ToString(), content }); request.Body.Position = 0; } } private void ResponseDataLog(HttpResponse response, MemoryStream ms) { ms.Position = 0; var responseBody = new StreamReader(ms).ReadToEnd(); // 去除 Html var reg = "<[^>]+>"; var isHtml = Regex.IsMatch(responseBody, reg); if (!string.IsNullOrEmpty(responseBody)) { Parallel.For(0, 1, e => { LogLock.OutLogAOP("接口日志", new string[] { "响应数据 - 响应数据类型:" + responseBody.GetType().ToString(), responseBody }); }); } } } public class RequestLogInfo { /// /// 请求地址 /// public string Path { get; set; } /// /// 请求参数 /// public string QueryString { get; set; } /// /// Body参数 /// public string BodyData { get; set; } } }