gpt4 book ai didi

asp.net-core - 防止 Kestrel 在端口使用时崩溃

转载 作者:行者123 更新时间:2023-12-03 03:07:02 27 4
gpt4 key购买 nike

我怀疑这是我正在尝试做的一件“奇怪”的事情,但是...我已将 Kestrel 配置为监听多个端口。问题是,有时这些端口之一已经在使用中。

这目前导致我的应用程序崩溃。

我希望看到的行为是它监听我指定的所有可用端口。但我无法找到有关该主题的任何示例/文档。

例如,我可以将其配置为监听 90、91、92、93...但如果端口 91 已在使用中,我希望它仅监听端口 90、92、93。我不这样做介意它是否抛出异常或记录错误,只要我能让它继续。我想避免“先检查”然后更改配置,因为这感觉就像等待发生竞争条件)

谁能告诉我如何让 Kestrel 仅在可用端口上启动?

最佳答案

您可以使用端口0;这样,Kestrel 在运行时动态绑定(bind)到可用端口,如所述 here :

private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:0");

此外,您还可以确定 Kestrel 在运行时实际绑定(bind)的端口,如下所示:

public static void Main(string[] args)
{
IWebHost webHost = CreateWebHostBuilder(args).Build();

webHost.Start();

string address = webHost.ServerFeatures
.Get<IServerAddressesFeature>()
.Addresses
.First();

int port = int.Parse(address.Split(':')[4]);
}

更新:

如果指定端口未被其他应用程序使用,您可以检查端口可用性并启动项目:

private static string[] GenerateUrls(IEnumerable<int> ports)
{
return ports.Select(port => $"http://localhost:{port}").ToArray();
}

private static IEnumerable<int> GetAvailablePorts(IEnumerable<int> ports)
{
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();

IEnumerable<int> allActivePorts = tcpConnInfoArray.Select(endpoint => endpoint.Port).ToList();

return ports.Where(port => !allActivePorts.Contains(port)).ToList();
}

最终结果将是这样的:

public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}

private static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
IWebHostBuilder webHost = WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();

int[] ports = { 5000, 5050, 8585 };

IEnumerable<int> availablePorts = GetAvailablePorts(ports).ToList();
if (!availablePorts.Any())
throw new InvalidOperationException("There are no active ports available to start the project.");

webHost.UseUrls(GenerateUrls(availablePorts));

return webHost;
}

关于asp.net-core - 防止 Kestrel 在端口使用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56607479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com