Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Kestrel端口:0,如何检测自动选择的端口_C#_Asp.net Core_Kestrel Http Server - Fatal编程技术网

C# Kestrel端口:0,如何检测自动选择的端口

C# Kestrel端口:0,如何检测自动选择的端口,c#,asp.net-core,kestrel-http-server,C#,Asp.net Core,Kestrel Http Server,我想让红隼自动选择一个端口。我的Program.cs如下所示: public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDef

我想让红隼自动选择一个端口。我的Program.cs如下所示:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                var builder = webBuilder.UseStartup<Startup>();
                if (args.Contains("--automatic-port-selection"))
                {
                    builder.UseUrls("http://127.0.0.1:0");
                }
            });
公共类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
var builder=webBuilder.UseStartup();
if(args.Contains(“--自动端口选择”))
{
builder.useURL(“http://127.0.0.1:0");
}
});
我试图了解如何检测所选端口,但实际上我希望在软件启动时获取端口

我尝试了以下方法:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services) { }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        var serverAddressesFeature =
            app.ServerFeatures.Get<IServerAddressesFeature>();


        if (serverAddressesFeature != null)
        {
            foreach (var address in serverAddressesFeature.Addresses)
            {
                int port = int.Parse(address.Split(':').Last());
                Console.Out.WriteLine("Port:" + port);
            }

            Console.Out.Flush();
        }

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); });
    }
}
公共类启动
{
//此方法由运行时调用。请使用此方法将服务添加到容器中。
//有关如何配置应用程序的更多信息,请访问https://go.microsoft.com/fwlink/?LinkID=398940
public void配置服务(IServiceCollection服务){}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
var服务器地址功能=
app.ServerFeatures.Get();
if(serverAddressesFeature!=null)
{
foreach(serverAddressesFeature.Addresses中的var地址)
{
int port=int.Parse(address.Split(':').Last());
控制台输出写入线(“端口:”+端口);
}
Console.Out.Flush();
}
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(端点=>{endpoints.MapGet(“/”,异步上下文=>{await context.Response.WriteAsync(“Hello World!”);});});
}
}
您可以看到这基本上只是一个从VisualStudio模板创建的aspnet核心应用程序

这里的问题是,它总是只写入0。似乎只有在处理请求时读取
serverAddressesFeature
.Addresses`时,它才能提供正确的端口号。启动服务器时,如何获取使用的端口号

编辑


这似乎是相关的:

据我所知,您总是获得0端口号的原因是应用程序没有完全启动

当应用程序启动时,它将首先调用startup.cs configure方法。这次Kestrel知道它的端口是0

之后,它将找到自动释放端口

因此,如果您想获取应用程序正在使用的端口,您可以编写一个方法,在应用程序完全声明后触发该方法,以记录正确的端口

更多详细信息,请参考以下代码:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime , IServiceProvider serviceProvider){

   //other codes ....

               lifetime.ApplicationStarted.Register(
  () => LogAddresses(app.ServerFeatures));
}

    static void LogAddresses(IFeatureCollection features)
    {
        var addressFeature = features.Get<IServerAddressesFeature>();
        if (addressFeature != null)
        {
            foreach (var address in addressFeature.Addresses)
            {
                int port = int.Parse(address.Split(':').Last());
                Console.Out.WriteLine("Port:" + port);
            }
        }
    }
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境、IHostApplicationLifetime生命周期、IServiceProvider服务提供商){
//其他代码。。。。
lifetime.ApplicationStarted.Register(
()=>日志地址(app.ServerFeatures));
}
静态void日志地址(IFeatureCollection功能)
{
var addressFeature=features.Get();
if(addressFeature!=null)
{
foreach(addressFeature.Addresss中的var地址)
{
int port=int.Parse(address.Split(':').Last());
控制台输出写入线(“端口:”+端口);
}
}
}
结果: