sunpengfei
2025-08-19 e94d90fd7d2ec6fcb41fb6aa6fc28e3f9d39ba95
FlexJobApi.Core/Utils/ResourceUtils/ResourceActionFilter.cs
@@ -11,6 +11,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Claims;
using System.Text;
@@ -22,44 +23,60 @@
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var resourceLog = new ResourceLog();
            resourceLog.CreatedTime = DateTimeOffset.Now;
            var stopwatch = Stopwatch.StartNew();
            var serviceScopeFactory = App.GetService<IServiceScopeFactory>();
            var serviceScope = serviceScopeFactory.CreateScope();
            var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<ResourceLog, LogDbContextLocator>>();
            var logier = JwtUtils.GetCurrentLogier();
            StringWriter consoleWriter = new();
            TextWriter originalConsoleOut = Console.Out;
            resourceLog.Id = IDGen.NextID();
            resourceLog.TraceId = App.GetTraceId();
            resourceLog.Method = EnumUtils.GetEnum<EnumResourceMethod>(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();
            await rep.InsertNowAsync(resourceLog);
            //============== 这里是执行方法之后获取数据 ====================
            var actionContext = await next();
            resourceLog.UpdatedTime = DateTimeOffset.Now;
            if (actionContext.Result is JsonResult jsonResult)
            try
            {
                resourceLog.Response = jsonResult.Value.ToJson();
                Console.SetOut(consoleWriter);
                var serviceScopeFactory = App.GetService<IServiceScopeFactory>();
                var serviceScope = serviceScopeFactory.CreateScope();
                var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<ResourceLog, LogDbContextLocator>>();
                var logier = JwtUtils.GetCurrentLogier();
                var resourceLog = new ResourceLog();
                resourceLog.CreatedTime = DateTimeOffset.Now;
                resourceLog.Id = IDGen.NextID();
                resourceLog.TraceId = App.GetTraceId();
                resourceLog.Method = EnumUtils.GetEnum<EnumResourceMethod>(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);
            }
            resourceLog.ResponseHeaders = context.HttpContext.Response.Headers.ToJson();
            resourceLog.IsSuccess = actionContext.Exception == null;
            stopwatch.Stop();
            resourceLog.ElapsedMilliseconds = stopwatch.ElapsedMilliseconds;
            await rep.UpdateNowAsync(resourceLog);
            finally
            {
                Console.SetOut(originalConsoleOut); // 恢复 Console 原始输出流
                consoleWriter.Dispose(); // 释放流资源
            }
        }
    }
}