sunpengfei
2025-12-01 c87d61d03b48a6f55c0a0819b9be522f77e3c9a0
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
83
84
85
86
87
88
89
90
using ApiTools.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 ApiTools.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.CreatedChannelId = logier?.ChannelId;
            resourceLog.Request = context.ActionArguments?.ToJson();
            resourceLog.RequestHeaders = context.HttpContext.Request.Headers.ToJson();
 
            if (resourceLog.Path != "/api/user/resource/checkHealth"
                && resourceLog.Path != "/api/common/logRecords/saveFrontConsoleLog")
            {
                //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;
 
            if (resourceLog.Path != "/api/user/resource/checkHealth"
                && resourceLog.Path != "/api/common/logRecords/saveFrontConsoleLog")
            {
                await rep.UpdateNowAsync(resourceLog);
            }
            //}
            //finally
            //{
            //    Console.SetOut(originalConsoleOut); // 恢复 Console 原始输出流
            //    consoleWriter.Dispose(); // 释放流资源
            //}
        }
    }
}