如何在 ConfigureServices ASP NET CORE 2.1 中获取主机和端口值

How to get host and port value in ConfigureServices ASP NET CORE 2.1

我需要从 public void ConfigureServices(IServiceCollection services) 动态获取主机(包括方案)和端口的值。我试图通过 IServerAddressesFeature 来做到这一点,但是当我试图解决它时,IoC 返回了 null(到目前为止它还没有注册)。那么,还有其他方法可以获取此信息吗?

ConfigureServices(IServiceCollection services) 方法用于配置应用程序的服务,如 Microsoft documentation 中所述。

在那里,您似乎无法直接从 WebHost 检索方案、主机和端口信息。 实际上,您通常会在 Program.cs:

中创建 WebHost
var webHost = WebHost.CreateDefaultBuilder(args) // initialise web host
            .UseStartup<Startup>()
            .Build();

但是,您可以通过查看 CreateDefaultBuilder() 正在使用的相同配置来检索 WebHost 使用的方案、主机和端口。

确实,查看 WebHost code, you can see CreateDefaultBuilder() loads configuration from both appsettings.json and appsettings.Development.json 以配置 WebHost,例如方案、主机和端口。你很可能在ConfigureServices(IServiceCollection services)中查看相同的配置数据并推导出相同的配置信息。

如果您的目标是 Asp.Net Core 2.1,您可以直接在 appsettings.json 文件中 configure your endpoints。您可以通过查看 Startup.cs.

中的 Configuration 属性 在您的 ConfigureServices(IServiceCollection services) 中执行相同的操作

您的 Startup.cs 可能如下所示:

public class Startup {

    public Startup(IConfiguration configuration) {

        Configuration = configuration;

    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services) {

        // get http url
        var httpEndpoint = Configuration["Kestrel:Endpoints:Http:Url"];

        // get https url
        var httpsEndpoint = Configuration["Kestrel:Endpoints:Https:Url"];

        /*
         * Use IConfiguration to retrieve information
         * about loaded configuration.
        */

        // Add framework services.
        services.AddMvc();

    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {

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

        app.UseMvc();

    }

}

查看 IConfiguration Microsoft documentation page 以了解有关可用于读取配置数据的方法的详细信息。

我需要为托管在 Kestrel 中的 Service Fabric 无状态应用程序访问 ConfigureServices 中的端口。

一种方法 (ref) 是将您在 Startup 中要做的事情放在构建 WebHost 的地方,在 Programs.cs 中(在我的例子中是我的 CreateServiceInstanceListeners服务结构无状态服务)

这是我正在处理的内容的片段:

                    var endpoint = Context.CodePackageActivationContext.GetEndpoint("ServiceEndpoint");
                    return new WebHostBuilder()
                        .UseKestrel(/* SSL STUFF GOES HERE */)
                        .ConfigureServices(
                            services => services
                                .AddSingleton<StatelessServiceContext>(serviceContext)
                                .AddMvc(options =>
                                {
                                    // Using the port here:
                                    options.SslPort = endpoint.Port;
                                    options.Filters.Add(new RequireHttpsAttribute());
                                }))                                   
                        .UseStartup<Startup>()
                        .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                        .UseUrls(url)
                        .Build();
                }))