You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

使用方式

  1. 创建工厂实例并启动服务器:
var factory = new ApiHubFactory<Program>();
factory.StartExternalServer();

// 保持程序运行,直到手动停止(示例为控制台等待输入)
Console.WriteLine("服务器已启动,按任意键停止...");
Console.ReadKey();

factory.StopExternalServer();
  1. 现在可通过浏览器访问http://localhost:5000或https://localhost:5001调用API端点。

注意事项

  • 确保指定端口未被其他程序占用。
  • 使用HTTPS时,需信任开发证书(可执行命令dotnet dev-certs https --trust)。
  • 此配置适用于需同时进行集成测试和外部访问的场景,若仅需外部访问,直接使用普通WebHost/WebApplication启动方式更简洁。

内容的提问来源于stack exchange,提问作者Narek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:37:26