public async Task Invoke(HttpContext httpContext) { int?statusCode = default(int?); var profilers = httpContext.RequestServices.ResolveMany <IProfiler <HttpProfilingContext> >(); if (!profilers.Any()) { await _next(httpContext); return; } Stopwatch stopwatch = Stopwatch.StartNew(); try { await _next(httpContext); statusCode = httpContext.Response.StatusCode; } catch { statusCode = 500; throw; } finally { stopwatch.Stop(); var context = new HttpProfilingContext { Elapsed = stopwatch.ElapsedMilliseconds, HttpHost = httpContext.Request.Host.Host, HttpMethod = httpContext.Request.Method, HttpPath = httpContext.Request.Path, HttpPort = httpContext.Request.Host.Port.ToString(), HttpProtocol = httpContext.Request.Protocol, HttpScheme = httpContext.Request.Scheme, IdentityAuthenticationType = httpContext.User.Identity.AuthenticationType, IdentityName = httpContext.User.Identity.Name, RequestContentType = httpContext.Request.ContentType, ResponseContentType = httpContext.Response.ContentType, StatusCode = statusCode?.ToString(), }; foreach (var profiler in profilers) { await profiler.Invoke(context); } } }
public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); if (filterContext.HttpContext.Items.Contains("stopwatch")) { var stopwatch = filterContext.HttpContext.Items["stopwatch"] as Stopwatch; var profiler = DependencyResolver.Current.GetService <IProfiler <HttpProfilingContext> >(); var context = new HttpProfilingContext { Elapsed = stopwatch.ElapsedMilliseconds, HttpHost = filterContext.HttpContext.Request.Url.Host, HttpMethod = filterContext.HttpContext.Request.HttpMethod, HttpPath = filterContext.HttpContext.Request.Path, HttpPort = filterContext.HttpContext.Request.Url.Port.ToString(), HttpScheme = filterContext.HttpContext.Request.Url.Scheme, IdentityAuthenticationType = filterContext.HttpContext.User?.Identity?.AuthenticationType, IdentityName = filterContext.HttpContext.User?.Identity?.Name, RequestContentType = filterContext.HttpContext.Request.ContentType, ResponseContentType = filterContext.HttpContext.Response.ContentType, StatusCode = filterContext.HttpContext.Response.StatusCode.ToString() }; profiler.Invoke(context); } }