【发布时间】:2021-06-02 15:26:07
【问题描述】:
在带有 EFCore-5 的 Asp.NET Core Web 应用程序中,我有以下 ConfigureServices
// ...
services.AddRouting(options => options.LowercaseUrls = true);
// get the connection string from secrets/env.variables
string connectionString = Configuration.GetConnectionString("MyWebApp"); /// <<< HERE
services.AddDbContext(connectionString);
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddControllersWithViews();
// ...
还有AddDbContext扩展方法:
public static void AddDbContext(this IServiceCollection services, string connectionString) =>
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(connectionString, /// <<< HERE
providerOptions =>
{
providerOptions
.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(30),
errorNumbersToAdd: null)
.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
});
options.EnableSensitiveDataLogging();
如果我将连接字符串放在appsettings.Production.json 中,站点运行良好,但是一旦我将其删除并放入 EnvironmentVariables,页面就会出现 500 错误,并且在我的日志中:
System.ArgumentNullException:值不能为空。 (范围 'connectionString')在 Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(字符串值, 字符串参数名称)在 Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder optionsBuilder,字符串连接字符串,操作`1 sqlServerOptionsAction)
错误指向上面代码中用第二个HERE标记的行。
我这样设置环境变量:
【问题讨论】:
-
在创建主机构建器时,您在
Program.cs中做了什么不同的事情吗?您是否尝试过在创建 env var 后关闭 VS 并重新打开?环境可能只加载一次并缓存。 -
@DavidG,这与 Visual Studio 无关,而是在生产中。在生产环境中,我们通常没有作为 Web 服务器的 Visual Studio
标签: asp.net-core environment-variables connection-string .net-5 ef-core-5.0