WebApplicationFactory配置宿主URL无效,API无法通过浏览器访问
解决WebApplicationFactory无法通过浏览器访问API的问题
问题根源
WebApplicationFactory默认使用TestServer,这是一个内存内服务器,不会绑定到实际网络端口,因此无法通过浏览器或外部HTTP客户端访问,仅能通过工厂创建的HttpClient调用。
解决方案
要让API可通过浏览器访问,需将默认的TestServer替换为Kestrel服务器,配置其监听指定URL,并确保服务器启动并保持运行。
修改后的自定义工厂代码
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; public class ApiHubFactory<TEntryPoint> : WebApplicationFactory<TEntryPoint> where TEntryPoint : class { public string HostUrl { get; set; } = "https://localhost:5001"; private IHost _host; protected override void ConfigureWebHost(IWebHostBuilder builder) { // 移除默认TestServer,替换为Kestrel builder.ConfigureServices(services => { services.RemoveAll<Microsoft.AspNetCore.Hosting.Server.IServer>(); services.AddSingleton<Microsoft.AspNetCore.Hosting.Server.IServer, KestrelServer>(); // 配置Kestrel监听指定端口 services.Configure<KestrelServerOptions>(options => { options.ListenLocalhost(5000); // HTTP端口 options.ListenLocalhost(5001, o => o.UseHttps()); // HTTPS端口 }); // 保留原有伪造认证方案配置 services.AddAuthentication(options => { options.DefaultAuthenticateScheme = TestAuthHandler.AuthenticationScheme; options.DefaultScheme = TestAuthHandler.AuthenticationScheme; options.DefaultChallengeScheme = TestAuthHandler.AuthenticationScheme; }) .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>(TestAuthHandler.AuthenticationScheme, options => { }); }); // 设置访问URL(与KestrelOptions配置二选一即可) builder.UseUrls("http://localhost:5000", HostUrl); } // 启动服务器,允许外部访问 public void StartExternalServer() { _host = CreateWebHostBuilder().Build(); _host.Start(); } // 停止服务器并释放资源 public void StopExternalServer() { _host?.StopAsync().Wait(); _host?.Dispose(); } }
使用方式
- 创建工厂实例并启动服务器:
var factory = new ApiHubFactory<Program>(); factory.StartExternalServer(); // 保持程序运行,直到手动停止(示例为控制台等待输入) Console.WriteLine("服务器已启动,按任意键停止..."); Console.ReadKey(); factory.StopExternalServer();
- 现在可通过浏览器访问
http://localhost:5000或https://localhost:5001调用API端点。
注意事项
- 确保指定端口未被其他程序占用。
- 使用HTTPS时,需信任开发证书(可执行命令
dotnet dev-certs https --trust)。 - 此配置适用于需同时进行集成测试和外部访问的场景,若仅需外部访问,直接使用普通WebHost/WebApplication启动方式更简洁。
内容的提问来源于stack exchange,提问作者Narek
相关产品推荐
相关产品推荐

