public async Task OnActionExecutedAsync(ResultExecutingContext context) { // The controller action didn't return a view result so no need to continue execution if (!(context.Result is ViewResult result)) { return; } // Check early to ensure we are working with a LayoutViewModel if (!(result?.Model is LayoutViewModel model)) { return; } // Get authenticated user from context var user = context.HttpContext.Features[typeof(User)] as User; // Get client details var ipV4Address = _clientIpAddress.GetIpV4Address(); var ipV6Address = _clientIpAddress.GetIpV6Address(); var userAgent = string.Empty; if (context.HttpContext.Request.Headers.ContainsKey("User-Agent")) { userAgent = context.HttpContext.Request.Headers["User-Agent"].ToString(); } // Get route data var url = context.HttpContext.Request.GetDisplayUrl(); // Get page title from context var title = context.HttpContext.Items[typeof(PageTitle)] is PageTitle pageTitle ? pageTitle.Title : string.Empty; // Get area name var areaName = string.Empty; if (context.RouteData.Values["area"] != null) { areaName = context.RouteData.Values["area"].ToString(); } // Get feature from area var feature = await _featureFacade.GetFeatureByIdAsync(areaName); // Add metric await _metricManager.CreateAsync(new Metric() { FeatureId = feature?.Id ?? 0, Title = title, Url = url, IpV4Address = ipV4Address, IpV6Address = ipV6Address, UserAgent = userAgent, CreatedUserId = user?.Id ?? 0, CreatedDate = DateTimeOffset.UtcNow }); }