繁体   English   中英

如何从 Asp.NET Core 3.1 Startup 类访问 launchSettings.json 中的 `applicationUrl` 属性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM