Kestrel 未在 xUnit 测试中收听

Kestrel not listening in xUnit test

我正在使用此自定义服务器进行单元测试,我使用 MyStarup 对其进行初始化,加载我需要进行测试的单个中间件。

这在 net47 之前有效,但在我将项目切换到 .net-core 后它停止了。它现在给了我这个非常有用的异常:

System.Net.Sockets.SocketException No connection could be made because the target machine actively refused it 127.0.0.1:30001

我使用工厂方法从 IClassFixture 创建它,并使用 HttpClient 调用它,我也使用工厂方法创建它并从同一个夹具中获取它。

public class MyServer : IDisposable
{
    private readonly IWebHost _host;        

    public MyServer(string url) // <-- http://localhost:30001
    {
        _host =
            new WebHostBuilder()
                .UseKestrel()
                .UseUrls(url)                    
                .UseStartup<MyStartup>()
                .Build();

        Task = _host.StartAsync(); // <-- tried RunAsync too, no difference
    }

    public Task Task { get; set; }

    public void Dispose()
    {
        _host.Dispose();
    }
}

所以我的问题是,我怎样才能让它再次工作?

我读了这个 为什么 Kestrel 不在指定端口上侦听? 但无助于解决。我不能 运行 它作为一个控制台,它以前工作过。为什么切换到 .net-core 后就停止了?

我明白了。您需要使用自定义配置为 Kestrel 指定 urls 值,否则它会使用一些 随机 (?) 或默认端口 5001。我不想使用 hosting.json 所以我使用了 InMemoryCollection

    public MyServer(string url)
    {
        var configuration =
            new ConfigurationBuilder()
                .AddInMemoryCollection(new Dictionary<string, string>
                {
                    ["urls"] = url
                })
                .Build();

        _host =
            new WebHostBuilder()
                .UseKestrel()
                //.UseUrls(url) // <-- cannot use this, seems to be deprecated
                //.Configure(app => { app.UsePathBase(url); }) // <-- does not work
                .UseConfiguration(configuration)
                .UseStartup<MyStartup>()
                .Build();

        Task = _host.StartAsync();
    }