aspnetcore/samples/Http2SampleApp/TimingMiddleware.cs

51 lines
1.5 KiB
C#

using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
namespace Http2SampleApp
{
// You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class TimingMiddleware
{
private readonly RequestDelegate _next;
public TimingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("Server-Timing");
var stopWatch = new Stopwatch();
stopWatch.Start();
await _next(httpContext);
stopWatch.Stop();
// Not yet supported in any browser dev tools
httpContext.Response.AppendTrailer("Server-Timing", $"app;dur={stopWatch.ElapsedMilliseconds}.0");
}
else
{
// Works in chrome
// httpContext.Response.Headers.Append("Server-Timing", $"app;dur=25.0");
await _next(httpContext);
}
}
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class TimingMiddlewareExtensions
{
public static IApplicationBuilder UseTimingMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<TimingMiddleware>();
}
}
}