using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using System.Linq; using System.Threading.Tasks; namespace AsbCloudWebApi.Middlewares; public class RequerstTrackerMiddleware { private readonly RequestDelegate next; public RequerstTrackerMiddleware(RequestDelegate next) { this.next = next; } public async Task InvokeAsync(HttpContext context) { var service = context.RequestServices.GetRequiredService(); var clientIp = context.Request.Headers["X-Real-IP"].FirstOrDefault(); var requestLog = new AsbCloudApp.Data.RequestLogDto { UserLogin = context.User.Identity?.Name ?? string.Empty, UserIp = clientIp ?? context.Connection?.RemoteIpAddress?.ToString(), RequestMethod = context.Request.Method, RequestPath = context.Request.Path.Value, RequestContentLength = context.Request.ContentLength, Referer = context.Request.Headers["Referer"].ToString(), }; { var userIdString = context.User?.FindFirst("id")?.Value; if (!string.IsNullOrEmpty(userIdString) && int.TryParse(userIdString, out int userId)) requestLog.UserId = userId; } var sw = System.Diagnostics.Stopwatch.StartNew(); try { await next.Invoke(context); sw.Stop(); requestLog.ElapsedMilliseconds = sw.ElapsedMilliseconds; requestLog.Status = context.Response.StatusCode; service.RegisterRequest(requestLog); } catch (System.Exception ex) { sw.Stop(); requestLog.ElapsedMilliseconds = sw.ElapsedMilliseconds; requestLog.Status = context.Response.StatusCode; service.RegisterRequestError(requestLog, ex); throw; } } }