using FlexJobApi.Core.Entities.Common; using Furion; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.Schedule; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { public class ResourceActionFilter : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var stopwatch = Stopwatch.StartNew(); StringWriter consoleWriter = new(); TextWriter originalConsoleOut = Console.Out; try { Console.SetOut(consoleWriter); var serviceScopeFactory = App.GetService(); var serviceScope = serviceScopeFactory.CreateScope(); var rep = serviceScope.ServiceProvider.GetRequiredService>(); var logier = JwtUtils.GetCurrentLogier(); var resourceLog = new ResourceLog(); resourceLog.CreatedTime = DateTimeOffset.Now; resourceLog.Id = IDGen.NextID(); resourceLog.TraceId = App.GetTraceId(); resourceLog.Method = EnumUtils.GetEnum(context.HttpContext.Request.Method); resourceLog.Domain = $"{context.HttpContext.Request.Scheme}://{context.HttpContext.Request.Host}"; resourceLog.Path = context.HttpContext.Request.Path; resourceLog.ClientIpAddress = context.HttpContext.GetRemoteIpAddressToIPv4(); resourceLog.CreatedUserId = logier?.Id; resourceLog.CreatedEnterpriseId = logier?.EnterpriseId; resourceLog.Request = context.ActionArguments?.ToJson(); resourceLog.RequestHeaders = context.HttpContext.Request.Headers.ToJson(); Console.SetOut(originalConsoleOut); await rep.InsertNowAsync(resourceLog); Console.SetOut(consoleWriter); //============== 这里是执行方法之后获取数据 ==================== var actionContext = await next(); Console.SetOut(originalConsoleOut); resourceLog.UpdatedTime = DateTimeOffset.Now; if (actionContext.Result is JsonResult jsonResult) { resourceLog.Response = jsonResult.Value.ToJson(); } resourceLog.ResponseHeaders = context.HttpContext.Response.Headers.ToJson(); resourceLog.IsSuccess = actionContext.Exception == null; resourceLog.ConsoleLogs = consoleWriter.ToString(); stopwatch.Stop(); resourceLog.ElapsedMilliseconds = stopwatch.ElapsedMilliseconds; await rep.UpdateNowAsync(resourceLog); } finally { Console.SetOut(originalConsoleOut); // 恢复 Console 原始输出流 consoleWriter.Dispose(); // 释放流资源 } } } }