"Ошибка System.IO.IOException: Failed to bind to address http://127.0.0.1:44837: address already in use."
У меня есть процесс net core в Linux, который в течение своей жизни запускает и закрывает другой процесс. «Основной» процесс передает адрес вспомогательному процессу для развертывания.
Вызов вспомогательного процесса выглядит так: Main.cs
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "dotnet",
UseShellExecute = false,
Arguments = Path.Join(*pathTo.dll*) + " " + args;
}
return Process.Start(startInfo).Id;
где args содержит IP-адрес типа http://localhost:44837/ и другие аргументы.
Вторичный процесс имеет следующую структуру Program.cs
public static IHostBuilder CreateHostBuilder(string[] args)
{
(...)
return Host.CreateDefaultBuilder(args)
.UseNLog()
.ConfigureServices((hostContext, services) =>
{
(..)
})
.ConfigureAppConfiguration((context, configurationBuilder) =>
{
(..)
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup<Startup>()
.UseConfiguration(configuration);
.UseUrls(myArgs(тут я задаю свой http://localhost:44837/)));
});
(...)
Основной процесс запускает потомка, потомок разворачивается на желаемом порте, но потом выпадает ошибка:
nfo: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:44837
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://127.0.0.1:44837: address already in use.
---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use
---> System.Net.Sockets.SocketException (98): Address already in use
at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
В интернете нашел 2 решения. Либо убить мешающий процесс, либо установить свободный порт в UseUrls.
Но в первом случае мне нужно сохранить оба процесса, а во втором я уже устанавливаю свободный порт в UseUrls.
На Windows запуск процесса немного другой, но структура IHostBuilder CreateHostBuilder та же и всё отрабатывает. А как быть с линуксом?