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(); // 释放流资源
|
//}
|
}
|
}
|
}
|