using System.Diagnostics; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; //集成 asp.net core 引用 TestHost(3.0+) using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Xunit; using Xunit.DependencyInjection; //如果使用最小API,则引用 using Xunit.DependencyInjection.AspNetCoreTesting; using Xunit.DependencyInjection.Logging; namespace HttpClientStudy.UnitTest { /// /// 依赖注入框架:Xunit.DependencyInjection, 必备设置类 /// public class Startup { /// /// 创建主机:可选,一般不用 /// /// public IHostBuilder CreateHostBuilder() { return Host.CreateDefaultBuilder(); } /// /// 配置主机:可选(集成Asp.Net Core时,配置主机) /// /// public void ConfigureHost(IHostBuilder hostBuilder) { //确保启动 webapi 项目 StartWebApiProject(); hostBuilder //主机配置 .ConfigureHostConfiguration(builder => { }) //应用配置 .ConfigureAppConfiguration((context, builder) => { }) //配置Web主机 .ConfigureWebHost(webHostBuilder => { webHostBuilder //测试主机,集成测试使用 .UseTestServer(options => { options.PreserveExecutionContext = true; }) .ConfigureTestServices(a => { }) .UseStartup(); //配置默认配置项 //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, HostBuilderContext context) { Debugger.Log(1, "DI", "ConfigureServices"); } /// /// 启动webapi项目 /// (出现webapi项目启动命令行窗口) /// private void StartWebApiProject() { string projectAndMutexName = WebApiConfigManager.GetWebApiConfigOption().CurrentValue.WebAppMutexName; //webapi项目不在运行状态则启动webapi项目 if (webAppIsRunningByMutex() == false) { //VS项目根目录 string vsProjectPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory)!.Parent!.Parent!.Parent!.Parent!.FullName; //webapi项目根项目 string webApiProjectPath = Path.Combine(vsProjectPath, projectAndMutexName); //启动命令信息 var prossInfo = new ProcessStartInfo("dotnet", $"run --project {webApiProjectPath}") { UseShellExecute = true, CreateNoWindow = false, RedirectStandardOutput = false }; //启动 Process.Start(prossInfo); } //由进程名判断 //bool webAppIsRunningByProcessName() //{ // return Process.GetProcessesByName(projectAndMutexName).ToList().Count == 0; //} //由互斥锁判断 bool webAppIsRunningByMutex() { bool createdResult = true; //创建互斥锁 using (var mutex = new Mutex(true, projectAndMutexName, out createdResult)) { if (createdResult) { mutex.ReleaseMutex(); } } //互斥锁是否创建成功 return !createdResult; } } private class WebApiStartup { public void ConfigureServices(IServiceCollection services) { services.AddLogging(lb => lb.AddXunitOutput()); } public void Configure(IApplicationBuilder app) { app.Run(static context => context.Response.WriteAsync("xxxxxx")); } } } }