| using Microsoft.AspNetCore.Http; | 
| using Microsoft.Extensions.Logging; | 
| using Newtonsoft.Json; | 
| using Org.BouncyCastle.Asn1.Ocsp; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Net; | 
| using System.Text; | 
| using System.Text.RegularExpressions; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_Core.LogHelper; | 
|   | 
| namespace WIDESEA_Core.Middlewares | 
| { | 
|     /// <summary> | 
|     /// 记录请求和响应数据 | 
|     /// </summary> | 
|     public class ApiLogMiddleware | 
|     { | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         private readonly RequestDelegate _next; | 
|   | 
|         public ApiLogMiddleware(RequestDelegate next, ILogger<ApiLogMiddleware> logger) | 
|         { | 
|             _next = next; | 
|         } | 
|   | 
|         //todo | 
|         public async Task InvokeAsync(HttpContext context) | 
|         { | 
|             if (App.ExpDateTime != null && (DateTime.Now - App.ExpDateTime.GetValueOrDefault()).TotalSeconds > 0) | 
|             { | 
|                 context.Response.StatusCode = HttpStatusCode.InternalServerError.ObjToInt(); | 
|                 context.Response.ContentType = "application/json"; | 
|   | 
|                 var json = new WebResponseContent(); | 
|   | 
|                 json.Message = HttpStatusCode.InternalServerError.ToString();//错误信息 | 
|                 json.Code = 500;//500异常  | 
|   | 
|                 StreamWriter streamWriter = new StreamWriter(context.Response.Body); | 
|                 await streamWriter.WriteAsync(json.Serialize()); | 
|                 return; | 
|             } | 
|   | 
|             // 过滤,只有接口 | 
|             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")) ?? true) && !((context.Request.Path.Value?.Contains("Get")) ?? true) && !((context.Request.Path.Value?.Contains("query")) ?? true) && !((context.Request.Path.Value?.Contains("Query")) ?? true) && !((context.Request.Path.Value?.Contains("DownLoadApp")) ?? true) && !((context.Request.Path.Value?.Contains("downLoadApp")) ?? true) && !((context.Request.Path.Value?.Contains("UploadApp")) ?? true) && !((context.Request.Path.Value?.Contains("uploadApp")) ?? true) && !((context.Request.Path.Value?.Contains("Large")) ?? true)) | 
|                         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; | 
|             string bodyData = sr.ReadToEndAsync().Result; | 
|             if (request.ContentLength <= 100000) | 
|             { | 
|                 obj = new | 
|                 { | 
|                     QueryString = request.QueryString.ToString(), | 
|                     BodyData = bodyData | 
|                 }; | 
|             } | 
|             else | 
|             { | 
|                 obj = new | 
|                 { | 
|                     QueryString = request.QueryString.ToString(), | 
|                     BodyData = "" | 
|                 }; | 
|             } | 
|             string data = JsonConvert.SerializeObject(obj); | 
|   | 
|             request.Body.Position = 0; | 
|   | 
|             return data; ; | 
|         } | 
|   | 
|         private string ResponseDataLog(HttpResponse response) | 
|         { | 
|             if (response.ContentLength <= 100000) | 
|             { | 
|                 response.Body.Position = 0; | 
|                 using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); | 
|                 string body = stream.ReadToEnd(); | 
|                 response.Body.Position = 0; | 
|                 return body; | 
|             } | 
|             return ""; | 
|         } | 
|     } | 
| } |