From a3ec9b2e64c3a6cf1e3de67bc68af0b19a5c95fd Mon Sep 17 00:00:00 2001 From: wanggaofeng <15601716045@163.com> Date: Fri, 2 Feb 2024 21:06:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HttpClientStudy.UnitTest/GlobalUsings.cs | 3 + .../HttpClientStudy.UnitTest.csproj | 15 ++++- HttpClientStudy.UnitTest/startup.cs | 64 +++++++++++++++++++ HttpClientStudy.WebApp/Program.cs | 4 ++ HttpClientStudy.WebApp/UsedTimeMiddleware.cs | 50 +++++++++++++++ 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 HttpClientStudy.UnitTest/startup.cs create mode 100644 HttpClientStudy.WebApp/UsedTimeMiddleware.cs diff --git a/HttpClientStudy.UnitTest/GlobalUsings.cs b/HttpClientStudy.UnitTest/GlobalUsings.cs index 6e54396..7cb47e9 100644 --- a/HttpClientStudy.UnitTest/GlobalUsings.cs +++ b/HttpClientStudy.UnitTest/GlobalUsings.cs @@ -17,6 +17,9 @@ global using Xunit.Extensions; global using Xunit.Internal; global using Xunit.Serialization; +global using Xunit.DependencyInjection; +global using Xunit.DependencyInjection.Logging; + global using HttpClientStudy.Model; global using HttpClientStudy.Config; diff --git a/HttpClientStudy.UnitTest/HttpClientStudy.UnitTest.csproj b/HttpClientStudy.UnitTest/HttpClientStudy.UnitTest.csproj index a43d6b5..c4814ff 100644 --- a/HttpClientStudy.UnitTest/HttpClientStudy.UnitTest.csproj +++ b/HttpClientStudy.UnitTest/HttpClientStudy.UnitTest.csproj @@ -10,9 +10,22 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/HttpClientStudy.UnitTest/startup.cs b/HttpClientStudy.UnitTest/startup.cs new file mode 100644 index 0000000..4e7c0b4 --- /dev/null +++ b/HttpClientStudy.UnitTest/startup.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace HttpClientStudy.UnitTest +{ + /// + /// 依赖注入 框架必备设置类 + /// + public class Startup + { + /// + /// 创建主机:可选,一般不用 + /// + /// + public IHostBuilder CreateHostBuilder() + { + return Host.CreateDefaultBuilder() ; + } + + /// + /// 配置主机:可选 + /// + /// + public void ConfigureHost(IHostBuilder hostBuilder) + { + //hostBuilder.ConfigureWebHost(webHostBuilder => + //{ + // webHostBuilder + // .UseTestServer() + // .ConfigureTestServices(a => { }); + // //webHostBuilder.UseTestServer(options => options.PreserveExecutionContext = true); + + // //配置默认配置项 + // //webHostBuilder.ConfigureAppConfiguration((context, configBuilder) => + // //{ + // // configBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + // // configBuilder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); + // //}); + + // //webHostBuilder.ConfigureServices(services => + // //{ + // // services.AddHealthChecks(); + // //}); + //}); + } + + /// + /// 注册服务:必须 + /// + /// + public void ConfigureServices(IServiceCollection services) + { + //services.AddTransient(); + } + } +} diff --git a/HttpClientStudy.WebApp/Program.cs b/HttpClientStudy.WebApp/Program.cs index 51d6e76..1f237c7 100644 --- a/HttpClientStudy.WebApp/Program.cs +++ b/HttpClientStudy.WebApp/Program.cs @@ -176,6 +176,10 @@ namespace HttpClientStudy.WebApp var app = builder.Build(); #region Httpܵ + + //ʱͳм + app.UseMiddleware(); + app.MapHealthChecks("api/health"); app.UseSwagger(); diff --git a/HttpClientStudy.WebApp/UsedTimeMiddleware.cs b/HttpClientStudy.WebApp/UsedTimeMiddleware.cs new file mode 100644 index 0000000..fbe743b --- /dev/null +++ b/HttpClientStudy.WebApp/UsedTimeMiddleware.cs @@ -0,0 +1,50 @@ +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); + } + } +}