【问题标题】:Find 2 different FREE ports for 2 kestrel servers为 2 个 kestrel 服务器找到 2 个不同的免费端口
【发布时间】:2020-06-26 21:12:23
【问题描述】:

我需要从控制台应用程序启动 2 个 Kestrel 服务器。下面的代码显示了我现在是如何做的。

不幸的是,两台服务器都尝试在相同的端口 HTTP:5000HTTPS:5001 上启动,但实际上只启动了第一个。

我还尝试在 appsettings.json 中指定 URLs,但它没有按预期工作,我不想硬编码服务器 URL,因为如果我重新启动控制台应用程序,它不会杀死以前启动的服务器并且可以不要再次启动它们。

问题

如何从代码为两台服务器的 HTTP 和 HTTPS 找到空闲端口并确保它们不同?

服务器

public class WebServer
{
  public static IWebHost Run<TStartup>(WebOptions options = null)
  {
    var configuration = new ConfigurationBuilder().Build();

    var environment = WebHost
      .CreateDefaultBuilder(new string[0])
      .ConfigureServices(o => o.AddSingleton(options))
      .UseConfiguration(configuration)
      .UseContentRoot(Directory.GetCurrentDirectory())
      .UseKestrel()
      .UseStartup<TStartup>()
      .Build();

    environment.RunAsync();

    return environment;
  }
}

var serviceEnvironment = Server.Run<ServiceStartup>();
var webEnvironment = Server.Run<WebStartup>();
var serviceAddresses = serviceEnvironment.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
var webAddresses = webEnvironment.ServerFeatures.Get<IServerAddressesFeature>().Addresses;

【问题讨论】:

    标签: asp.net-core kestrel-http-server


    【解决方案1】:

    您可以绑定到端口 0,Kestrel 会自动找到一个随机的可用端口。

    来自 Kestrel 的 Microsoft docs

    当指定端口号 0 时,Kestrel 会动态绑定到一个 可用端口。以下示例显示了如何确定哪个 端口 Kestrel 在运行时实际绑定:

    public void Configure(IApplicationBuilder app)
    {
        var serverAddressesFeature = 
            app.ServerFeatures.Get<IServerAddressesFeature>();
    
        app.UseStaticFiles();
    
        app.Run(async (context) =>
        {
            context.Response.ContentType = "text/html";
            await context.Response
                .WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
                    "<title></title></head><body><p>Hosted by Kestrel</p>");
    
            if (serverAddressesFeature != null)
            {
                await context.Response
                    .WriteAsync("<p>Listening on the following addresses: " +
                        string.Join(", ", serverAddressesFeature.Addresses) +
                        "</p>");
            }
    
            await context.Response.WriteAsync("<p>Request URL: " +
                $"{context.Request.GetDisplayUrl()}<p>");
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2010-09-17
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多