sunpengfei
2025-08-15 313c3132dcd1768df34e3717544df9e0e9d36514
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
using FlexJobApi.Core.Entities.Common;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DistributedIDGenerator;
using Furion.Schedule;
using Microsoft.AspNetCore.Http;
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.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 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();
 
            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;
            resourceLog.Response = actionContext.Result.ToJson();
            resourceLog.ResponseHeaders = context.HttpContext.Response.Headers.ToJson();
            resourceLog.IsSuccess = actionContext.Exception == null;
 
            stopwatch.Stop();
            resourceLog.ElapsedMilliseconds = stopwatch.ElapsedMilliseconds;
 
            await rep.UpdateNowAsync(resourceLog);
        }
    }
}