我使用这个自定义服务器进行单元测试,我用MyStarup初始化它,它加载了测试所需的单个中间件。
这以前对net47起过作用,在我将项目切换到..net core之后就停止了。现在它给了我一个非常有用的例外:
System.Net.Sockets.SocketException无法连接,因为目标机器主动拒绝了127.0.0.1:30001
我用一个工厂方法从一个IClassFixture创建它,然后用一个HttpClient调用它,这个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();
}
}所以我的问题是,我怎样才能让它再起作用?
我读过这个Why Kestrel doesn't listen at specified port? ,但它无助于解决它。我不能将它作为控制台运行,而且它以前也在工作。为什么它在切换到..net core之后就停止了?
发布于 2019-07-26 20:36:52
我想通了。您需要使用自定义配置来为urls指定Kestrel值,否则它将使用一些随机(?)或默认端口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();
}https://stackoverflow.com/questions/57224717
复制相似问题