首先,我的主要目的是动态设置我的应用程序的 IP 和端口。
我正在使用
IConfiguration
注入 json 配置文件,就像提到的一些教程一样。
但是,我无法检索Program.cs中的配置,因为我的
WebHostBuilder
将同时使用StartUp和Url。
所以在主机建立时,我的配置中没有任何内容。
WebProtocolSettings settings_Web = new WebProtocolSettings();
var host = new WebHostBuilder()
.UseIISIntegration()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseUrls(settings_Web.Url + ":" + settings_Web.Port)
.Build();
在 Startup.cs 中
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; set; }
public void ConfigureServices(IServiceCollection services)
{
// Adds services required for using options.
services.AddOptions();
var _WebProtocolSettings = Configuration.GetSection("WebProtocolSettings");
// Register the IConfiguration instance
services.Configure<WebProtocolSettings>(_WebProtocolSettings);
}
我的appsettings.json:
{
"WebProtocolSettings": {
"Url": "127.0.0.1",
"Port": 5050
}
}
我的 WebProtocolSettings.cs:
public class WebProtocolSettings
{
public string Url { get; set; }
public int Port { get; set; }
}
在 .NET 6 中
var builder = WebApplication.CreateBuilder(args);
// Using the GetValue<type>(string key) method
var configValue = builder.Configuration.GetValue<string>("Authentication:CookieAuthentication:LoginPath");
// or using the index property (which always returns a string)
var configValue = builder.Configuration["Authentication:CookieAuthentication:LoginPath"];
更新.Net 6
现在可以通过调用 GetValue(string key) 扩展方法轻松从
您必须在主方法中构建配置,获取该部分并将其绑定到您的模型。没有办法绕过它。
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.Build();
WebProtocolSettings settings_Web = new WebProtocolSettings();
config.GetSection("WebProtocolSettings").Bind(settings_Web);
var host = new WebHostBuilder()
.UseIISIntegration()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseUrls(settings_Web.Url + ":" + settings_Web.Port)
.Build()
host.Run();
}
##更新
另一种方法是将配置传递给
UseConfiguration
,如中所述
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.AddCommandLine(args)
.Build();
var host = new WebHostBuilder()
.UseUrls("http://*:5000")
.UseConfiguration(config)
.UseKestrel()
.Configure(app =>
{
app.Run(context =>
context.Response.WriteAsync("Hello, World!"));
})
.Build();
host.Run();
}
或在 ASP.NET Core > 2.0 中
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.AddCommandLine(args)
.Build();
return WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseConfiguration(config)
.Configure(app =>
{
app.Run(context =>
context.Response.WriteAsync("Hello, World!"));
})
.Build();
}
.UseConfiguration
(Tseng 的替代答案)是最简单的方法,但请注意,以这种方式配置时,运行时对配置文件所做的更改不会应用于您的 IConfiguration 对象。为了保持配置动态,您必须使用 .ConfigureAppConfiguration
- 但随后您必须额外构建配置以便在 Main()
中使用。不过,您可以重复使用配置它的代码。
ASP.NET Core 2.2:
public static void Main(string[] args)
{
IConfigurationBuilder configBuilderForMain = new ConfigurationBuilder();
ConfigureConfiguration(configBuilderForMain);
IConfiguration configForMain = configBuilderForMain.Build();
// ... use configForMain to read config here ...
var host = new WebHostBuilder()
.ConfigureAppConfiguration(ConfigureConfiguration)
// ... the rest of it ...
.Build();
}
public static void ConfigureConfiguration(IConfigurationBuilder config)
{
config.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
}
在asp.net core 3.1中,您可以通过
hostContext
访问配置。该示例基于工人服务项目:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
//Access configuration here with the Host Context. For example, to get a connection string from AppSettings.json:
var connectionString = hostContext.Configuration.GetConnectionString("MyConnectionString");
services.AddHostedService<Worker>();
});
}
一个老问题有一些新答案,所以这就是我喜欢这样做的方式。
在 appsettings.json 中定义配置
"ServiceConfig": { "PortNumber": 5005 },
为配置创建一个类:
public class ServiceConfig
{
private readonly IConfiguration configuration;
public const string SectionName = "ServiceConfig";
public ServiceConfig(IConfiguration config)
{
configuration = config;
configuration.GetSection(SectionName).Bind(this);
}
public int PortNumber { get; set; }
}
在Program.cs中使用配置:
var config = new ServiceConfig(builder.Configuration);
builder.WebHost.UseUrls($"http://*:{config.PortNumber}");
此方法还有一个额外的好处,即也可以用作依赖注入的服务:
builder.Services.AddSingleton<ServiceConfig>();
在 .NET 7 中,您需要使用
BuildServiceProvider()
所以你的
program.cs
的顶部看起来像这样;
var builder = WebApplication.CreateBuilder(args);
var provider = builder.Services.BuildServiceProvider();
var _configuration = provider.GetRequiredService<IConfiguration>();
然后您可以像这样访问您的
appsettings.json
值;
var configVal = _configuration.GetSection("Foo").GetValue<string>("Bar");
支持命令行参数和默认应用程序设置文件的方法:
public static class Configuration
{
public static IConfigurationRoot BuildConfigurationRoot()
{
var args = Environment.GetCommandLineArgs();
var envArg = Array.IndexOf(args, "--environment");
var envFromArgs = envArg >= 0 ? args[envArg + 1] : null;
var aspnetcore = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var dotnetcore = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
var environment = envFromArgs ?? (string.IsNullOrWhiteSpace(aspnetcore)
? dotnetcore
: aspnetcore);
var configuration = new ConfigurationBuilder()
.AddCommandLine(Environment.GetCommandLineArgs())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{environment}.json",
optional: true)
.Build();
return configuration;
}
}
.NET 8
给定
appsettings.json
文件:
{
"MySettings": {
"Name": "Bob",
"Counter": "100",
}
}
和
MySettings
类:
public class MySettings
{
public string? Name { get; set; }
public int? Counter { get; set; }
}
读取
Program.cs
文件中的这些值:
var builder = WebApplication.CreateBuilder(args);
var mySettings = new MySettings();
builder.Configuration.GetRequiredSection(nameof(MySettings)).Bind(mySettings);
var name = mySettings.Name; // Bob
var counter = mySettings.Counter; // 100
在.net core 3.1中,您可以使用ConfigurationHelper.GetConfiguration()来获取appSetting变量:
appSettings.json
"Endpoint": {
"ip": "170.888.88.888",
"port": 88888}
程序.cs
public class Program
{
public static void Main(string[] args)
{
var config = ConfigurationHelper.GetConfiguration();
var ip = config["Endpoint:ip"];
var port = config["Endpoint:port"];
}
}
使用此代码:
public class Program
{
private static string _environmentName;
public static void Main(string[] args)
{
var webHost = BuildWebHost(args);
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.{_environmentName}.json", optional: true, reloadOnChange: true)
.AddCommandLine(args)
.Build();
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, config) =>
{
config.ClearProviders();
_environmentName = hostingContext.HostingEnvironment.EnvironmentName;
}).UseStartup<Startup>().Build();
}