[英]ASP.NET core 3.1: does ConfigureAppConfiguration interacts with launchSettings.json?
[英]How Do You Access the `applicationUrl` Property Found in launchSettings.json from Asp.NET Core 3.1 Startup class?
我目前正在创建一个 Asp.NET Core 3.1 API 应用程序。 在其中,我有一个launchSettings.json
:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:61392",
"sslPort": 44308
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"environmentVariables": {
"Key": "Value",
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Application.API": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}
特别是,我对获取此文件中定义的applicationUrl
值很感兴趣。 不幸的是,除了通过 JSON 序列化直接加载文件并探测那里的值之外,我没有看到任何明显的方法来访问它们。
因此,我正在寻找更优雅的解决方案。 有没有办法从Startup.Configure
和/或Startup.ConfigureServices
方法中访问这些值?
我在想类似的事情:
public void Configure(IApplicationBuilder builder)
{
var url = builder.ApplicationServices.GetRequiredService<IServerHostingEnvironment>().ApplicationUrl
}
作为参考,我确实看到了这个问题,但这似乎需要一个 HTTP 请求。 就我而言,在发出请求之前,我仍在配置服务器。
进一步参考和上下文:我正在构建一个 .NET GitHub App 应用程序,并且正在制作 Smee.io 客户端的相应等价物,其 Javascript 代码可以在这里找到。
客户端获取source
(通过服务器发送的事件)并将其发送到target
。 我找到并配置了source
,但具有讽刺意味的是,在以明显的配置方式访问和建立target
URL(上面看到的applicationUrl
)时遇到了麻烦。
最后,我意识到我可以在appSettings.json
对值进行硬编码,但这意味着我将在两个地方维护相同的值——一个在appSettings.json
,另一个在已经存在的launchSettings.json
。 如果可能的话,我宁愿把它放在一个地方以减少维护负担。
尚未测试,但我使用此模式访问 appsettings.json。
在 startup.cs 中将 launchsettings.json 添加到配置构建器:
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder().AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "Properties", "launchSettings.json"));
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
将其添加为服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton <IConfiguration> (Configuration);
}
将其注入控制器并获取键值:
public class SomeController: ControllerBase {
private IConfiguration _iconfiguration;
public SomeController(IConfiguration iconfiguration) {
_iconfiguration = iconfiguration;
}
void SomeMethod(){
string appUrl = _iConfiguration.GetValue<string>("applicationUrl","someDefaultValue")
} }
希望这可以帮助你!
实际上,我最近也在寻找类似的东西。
事实证明,您可以通过查看环境变量来确定在调试会话期间 Visual Studio 将哪些 URL 传递给应用程序(来自 launchSettings.json 中的 applicationUrl)。
尽管记住这可能仅对使用 launchSettings.json 文件的 VStudio IDE 中的调试有用
var urls = Environment.GetEnvironmentVariable("ASPNETCORE_URLS").Split(";");
在您的Startup
构造函数中,您可以从依赖注入中获取IConfiguration
。 有了这个,您可以使用如下配置访问appsettings.json
的属性:
var appUrl = _configuration["profiles:applicationUrl"];
如果您将访问appsettings.json
许多属性,则可以使用IConfiguration.Bind()
方法将配置 json 中的所有属性绑定到类实例。 例如,您将拥有:
public class Config
{
public Profile Profiles { get; set; }
}
public class Profile
{
public string ApplicationUrl { get; set; }
}
然后在ConfigureServices
:
var config = new Config();
_configuration.Bind(config);
然后,如果您将配置注册到 serviceprovider 中,您就可以通过 DI 在任何地方访问您的配置:
services.AddSingleton(config);
编辑
要添加默认 appsettings.json 以外的 json 文件,请在下面记录的Program.cs
CreateDefaultBuilder
之后调用 IWebHostBuilder 上的ConfigureAppConfiguration()
。
在回调参数中,您可以将任意数量的 json、xml、ini 文件添加到您想要的配置中,然后使用我上面的回答从所有文件中获取任何值。 请注意,如果存在两个相同的键,则将使用该键的最后一个值。
我知道,一年过去了,但这个解决方案可能对某人有用:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
var appUrl = configuration["ASPNETCORE_URLS"].Split(";").First();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.