sunpengfei
2025-08-20 a9ee8bf270eb8a3315808b24b41417be4b1a8a9a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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<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);
            //}
            //finally
            //{
            //    Console.SetOut(originalConsoleOut); // 恢复 Console 原始输出流
            //    consoleWriter.Dispose(); // 释放流资源
            //}
        }
    }
}