namespace HttpClientStudy.WebApp { /// /// 接口耗时 中间件 /// public class UsedTimeMiddleware { private const string RESPONSE_HEADER_RESPONSE_TIME = "X-WebApi-UseTime"; private readonly RequestDelegate _next; /// /// 构造函数 /// /// 下一中间件 public UsedTimeMiddleware(RequestDelegate next) { _next = next; } /// /// 中间件执行方法 /// /// Http请求上下文 /// public Task InvokeAsync(HttpContext context) { var watch = new System.Diagnostics.Stopwatch(); watch.Start(); //此时还没结束响应:计进结束偏早,不是太准确 //可以加个500毫秒平衡一下 context.Response.OnStarting(() => { watch.Stop(); var responseTimeForCompleteRequest = watch.ElapsedMilliseconds; context.Response.Headers[RESPONSE_HEADER_RESPONSE_TIME] = responseTimeForCompleteRequest.ToString(); return Task.CompletedTask; }); // 响应完成时触发:计时更准确,但此时(绝大部分情况下)已经不能再修改响应头了。只能用在其它方面:如日志记录、统计等。 context.Response.OnCompleted(() => { //context.Response.Headers[RESPONSE_HEADER_RESPONSE_TIME] = "xxxxxx"; return Task.CompletedTask; }); return this._next(context); } } }