using Aspose.Words; using NPOI.HSSF.Record; using OASystem.Domain.Attributes; using OASystem.Domain.Entities.Customer; using OASystem.Infrastructure.Repositories.CRM; using System.ComponentModel.DataAnnotations; using System.Diagnostics; using XAct; using static Google.Protobuf.Reflection.SourceCodeInfo.Types; namespace OASystem.API.Middlewares { /// /// 指定API操作记录信息 /// public class RecordAPIOperationMiddleware { private readonly RequestDelegate _next; private readonly HttpClient _httpClient; private readonly IConfiguration _config; private readonly SqlSugarClient _sqlSugar; public RecordAPIOperationMiddleware(RequestDelegate next, IConfiguration config, HttpClient httpClient, SqlSugarClient sqlSugar) { _next = next; _httpClient = httpClient; _config = config; _sqlSugar = sqlSugar; } public async Task InvokeAsync(HttpContext context) { // 启用请求体流的缓冲,允许多次读取 context.Request.EnableBuffering(); // 读取请求体内容 var requestBodyText = await ReadRequestBody(context.Request); // 检查控制器方法是否使用了自定义属性 var endpoint = context.GetEndpoint(); var apiLogAttribute = endpoint?.Metadata?.GetMetadata(); if (apiLogAttribute != null) { var startTime = DateTime.UtcNow; // 保存原始响应体流 var originalResponseBody = context.Response.Body; // 创建一个新的内存流来捕获响应体 using var responseMemoryStream = new MemoryStream(); context.Response.Body = responseMemoryStream; // 调用下一个中间件 await _next(context); // 读取响应体内容 var responseBodyText = await new StreamReader(responseMemoryStream).ReadToEndAsync(); // 重置响应体流的位置 responseMemoryStream.Position = 0; // 将响应体内容写回原始响应体流 await responseMemoryStream.CopyToAsync(originalResponseBody); // 记录请求结束时间 var endTime = DateTime.UtcNow; // 计算耗时 var duration = (long)(endTime - startTime).TotalMilliseconds; int portType = 1; var logInfo = new Crm_TableOperationRecord() { TableName = apiLogAttribute.TableName, PortType = portType, OperationItem = apiLogAttribute.OperationEnum, DataId = apiLogAttribute.DataId, RequestUrl = context.Request.Path, RequestParam = requestBodyText, ReturnResult = responseBodyText, Elapsed = duration, Status = context.Response.StatusCode.ToString(), }; // 存储到数据库 await _sqlSugar.Insertable(logInfo).ExecuteCommandAsync(); } else { // 调用下一个中间件 await _next(context); } } private async Task ReadRequestBody(HttpRequest request) { request.EnableBuffering(); // 读取请求体内容 using var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true); var requestBodyText = await reader.ReadToEndAsync(); // 重置请求体流的位置 request.Body.Position = 0; return requestBodyText; } private async Task GetExternalIp() { var response = await _httpClient.GetAsync("https://ifconfig.me"); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } private async Task GetIpLocation(string ip) { var response = await _httpClient.GetAsync($"https://ipinfo.io/{ip}/json"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); var ipInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(json); return $"{ipInfo.country}, {ipInfo.city}"; } } }