diff --git a/src/Tye.Hosting/Model/ServiceBinding.cs b/src/Tye.Hosting/Model/ServiceBinding.cs index 8f067f1e..61092e49 100644 --- a/src/Tye.Hosting/Model/ServiceBinding.cs +++ b/src/Tye.Hosting/Model/ServiceBinding.cs @@ -8,6 +8,7 @@ namespace Tye.Hosting.Model { public string? Name { get; set; } public string? ConnectionString { get; set; } + public bool AutoAssignPort { get; set; } public int? Port { get; set; } public int? InternalPort { get; set; } public string? Host { get; set; } diff --git a/src/Tye.Hosting/ProxyService.cs b/src/Tye.Hosting/ProxyService.cs index 212d4076..e2d3a61b 100644 --- a/src/Tye.Hosting/ProxyService.cs +++ b/src/Tye.Hosting/ProxyService.cs @@ -59,11 +59,16 @@ namespace Tye.Hosting foreach (var binding in service.Description.Bindings) { - if (binding.Port == null) + if (binding.Port == null && !binding.AutoAssignPort) { continue; } + if (binding.Port == null) + { + binding.Port = GetNextPort(); + } + if (service.Description.Replicas == 1) { // No need to proxy @@ -80,7 +85,12 @@ namespace Tye.Hosting ports.Add(port); } - _logger.LogInformation("Mapping external port {ExternalPort} to internal port(s) {InternalPorts} for {ServiceName}", binding.Port, string.Join(", ", ports.Select(p => p.ToString())), service.Description.Name); + _logger.LogInformation( + "Mapping external port {ExternalPort} to internal port(s) {InternalPorts} for {ServiceName} binding {BindingName}", + binding.Port, + string.Join(", ", ports.Select(p => p.ToString())), + service.Description.Name, + binding.Name ?? binding.Protocol); service.PortMap[binding.Port.Value] = ports; diff --git a/src/tye/ConfigModel/ConfigApplication.cs b/src/tye/ConfigModel/ConfigApplication.cs index fa6b460e..855380b9 100644 --- a/src/tye/ConfigModel/ConfigApplication.cs +++ b/src/tye/ConfigModel/ConfigApplication.cs @@ -60,6 +60,7 @@ namespace Tye.ConfigModel { ConnectionString = binding.ConnectionString, Host = binding.Host, + AutoAssignPort = binding.AutoAssignPort, InternalPort = binding.InternalPort, Name = binding.Name, Port = binding.Port, diff --git a/src/tye/ConfigModel/ConfigFactory.cs b/src/tye/ConfigModel/ConfigFactory.cs index 9dca2876..a7485c28 100644 --- a/src/tye/ConfigModel/ConfigFactory.cs +++ b/src/tye/ConfigModel/ConfigFactory.cs @@ -157,7 +157,10 @@ namespace Tye.ConfigModel var uri = new Uri(address); service.Bindings.Add(new ConfigServiceBinding() { - Port = uri.Port, + // Don't use ports from launch profiles. These are very likely to be the same defaults (5000, 5001) + // that were generated when the project was created, and so they will almost always conflict + // between multiple apps. + AutoAssignPort = true, Protocol = uri.Scheme }); } diff --git a/src/tye/ConfigModel/ConfigServiceBinding.cs b/src/tye/ConfigModel/ConfigServiceBinding.cs index 1e37798e..880ffa3c 100644 --- a/src/tye/ConfigModel/ConfigServiceBinding.cs +++ b/src/tye/ConfigModel/ConfigServiceBinding.cs @@ -8,6 +8,7 @@ namespace Tye.ConfigModel { public string? Name { get; set; } public string? ConnectionString { get; set; } + public bool AutoAssignPort { get; set; } public int? Port { get; set; } public int? InternalPort { get; set; } public string? Host { get; set; }