.net core kestrel服务无法使用配置
.net core kestrel service can't use configuration
我已经使用 nginx 在 linux 上设置了一个 .net 核心应用程序。它与 dotnet MyProject.dll
完美配合。但是,使用 this link 中的说明,当我尝试设置 kestrel 服务时,它似乎无法在启动 class 中使用 Configuration
.这是我的 Program
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
var configEnv = new ConfigurationBuilder().AddEnvironmentVariables().Build();
return WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.ConfigureAppConfiguration((ctx, builder) =>
{
var keyVaultEndpoint = configEnv["KEYVAULT_ENDPOINT"];
if (!string.IsNullOrEmpty(keyVaultEndpoint))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(
keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
}
})
.UseStartup<Startup>()
.UseUrls("http://localhost:5050")
.Build();
}
}
我的启动 class 具有以下内容:
services.AddDbContext<ApplicationDBContext>(config => {
config.UseMySql(Configuration["ConnectionString"]);
});
当我使用 kestrel 运行 时,我不断收到错误提示 connectionString
参数属性不能为空。连接字符串在 azure key vault 中设置。当我这样做 dotnet MyProject.dll
时,这个和所有其他秘密都有效。使用kestrel服务时,我也试过设置环境变量,还是没有报同样的错误。
这是我的红隼服务:
[Unit]
Description=Example.NET Web API App running on Ubuntu
[Service]
WorkingDirectory =/ home / MyProject / publish2 / files
ExecStart=/usr/bin/dotnet /home/MyProject/publish2/files/MyProject.dll
Restart = always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User = www - data
#Environment=ASPNETCORE_ENVIRONMENT=Production
#Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false/etc/systemd/system/
[Install]
WantedBy=multi-user.target
我试过对上面的环境变量进行注释和不进行注释。同样的结果。我需要为 kestrel 服务添加什么吗?
更新
甚至尝试在服务文件中设置Environment=ConnectionString
,还是一样。
原来 .net core
在 运行 使用服务时读取的唯一环境变量是在服务文件中配置的变量。将其添加到此文件中解决了问题:
Environment=KEYVAULT_ENDPOINT=myendpointurlhere
我已经使用 nginx 在 linux 上设置了一个 .net 核心应用程序。它与 dotnet MyProject.dll
完美配合。但是,使用 this link 中的说明,当我尝试设置 kestrel 服务时,它似乎无法在启动 class 中使用 Configuration
.这是我的 Program
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
var configEnv = new ConfigurationBuilder().AddEnvironmentVariables().Build();
return WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.ConfigureAppConfiguration((ctx, builder) =>
{
var keyVaultEndpoint = configEnv["KEYVAULT_ENDPOINT"];
if (!string.IsNullOrEmpty(keyVaultEndpoint))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(
keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
}
})
.UseStartup<Startup>()
.UseUrls("http://localhost:5050")
.Build();
}
}
我的启动 class 具有以下内容:
services.AddDbContext<ApplicationDBContext>(config => {
config.UseMySql(Configuration["ConnectionString"]);
});
当我使用 kestrel 运行 时,我不断收到错误提示 connectionString
参数属性不能为空。连接字符串在 azure key vault 中设置。当我这样做 dotnet MyProject.dll
时,这个和所有其他秘密都有效。使用kestrel服务时,我也试过设置环境变量,还是没有报同样的错误。
这是我的红隼服务:
[Unit]
Description=Example.NET Web API App running on Ubuntu
[Service]
WorkingDirectory =/ home / MyProject / publish2 / files
ExecStart=/usr/bin/dotnet /home/MyProject/publish2/files/MyProject.dll
Restart = always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User = www - data
#Environment=ASPNETCORE_ENVIRONMENT=Production
#Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false/etc/systemd/system/
[Install]
WantedBy=multi-user.target
我试过对上面的环境变量进行注释和不进行注释。同样的结果。我需要为 kestrel 服务添加什么吗?
更新
甚至尝试在服务文件中设置Environment=ConnectionString
,还是一样。
原来 .net core
在 运行 使用服务时读取的唯一环境变量是在服务文件中配置的变量。将其添加到此文件中解决了问题:
Environment=KEYVAULT_ENDPOINT=myendpointurlhere