| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics; |
| | | using System.IO; |
| | | using System.Linq; |
| | | using System.Security.Claims; |
| | | using System.Text; |
| | |
| | | { |
| | | 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(); // 释放流资源 |
| | | } |
| | | } |
| | | } |
| | | } |