配置 ASP.NET 核心应用程序的 "prod" 和 "dev"
Configure the "prod" and "dev" of an ASP.NET Core application
我尝试为我的 ASP.NET Core 2.0 应用程序设置 "dev" 和 "prod" 环境,但它不起作用...这是我的配置:
appsettings.json
内容(与appsettings.Development.json
完全相同)
{
"Logging": {
"IncludeScopes": false,
"LogLevel": { "Default": "Warning" }
},
"ConnectionStrings": {
"MyAppContext":
"...AccountName=MyApptables4dev; AccountKey=xxxxxx==;EndpointSuffix=core.windows.net"
},
"Authentication": {
"AzureAd": {
"AADInstance": "https://login.microsoftonline.com/",
"CallbackPath": "/signin-oidc",
"ClientId": "xxxxxxx",
"Domain": "MyAppapp-dev.azurewebsites.net",
"TenantId": "yyyyyyy"
}
}
}
对于 appsettings.Production.json
仅连接字符串和域名更改:
"MyAppContext":"...AccountName=MyApptables4dev;AccountKey=yyyyyy==;EndpointSuffix=core..."
和
"Domain": "MyAppapp.azurewebsites.net",
Startup.cs
:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
builder = builder.AddUserSecrets<Startup>();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
// Adds services required for using options.
services.AddOptions();
// Register the IConfiguration instance which "ConnectionStrings" binds against.
//services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
services.Configure<AppSecrets>(Configuration);
services.AddSingleton<ITableRepositories, TableClientOperationsService>();
// ...
secrets.json
(位于用户文件夹)内容
{
"MyAppTablesConnectionString": "DefaultEndpointsProtocol=https;AccountName=myapptables4dev;AccountKey=xxx==;EndpointSuffix=core.windows.net"
}
最后 Class 访问数据库(在我的例子中是 AzureTables)
public class TableClientOperationsService : ITableRepositories
{
// ...
public TableClientOperationsService() { }
public TableClientOperationsService(IOptions<AppSecrets> optionsAccessor)
{
tables = new Dictionary<string, CloudTable>();
// 'null' in 'prod'!
connectionString = optionsAccessor.Value.MyAppTablesConnectionString;
}
知道 MyAppTablesConnectionString
在 "Production" 中是 "null",也许问题出在这里,但我不知道如何让它与 [=25= 一起工作] 和 MyAppTablesConnectionString
连接字符串...
因此您的代码从 MyAppTablesConnectionString
设置中读取值:
connectionString = optionsAccessor.Value.MyAppTablesConnectionString;
但根据提供的信息,只有 dev env 有此设置(通过 secret.json 定义并由 builder = builder.AddUserSecrets<Startup>();
读取)。
是的,生产环境得到了 null
,因为该设置未在任何配置源中定义:
- 用户密码不与产品一起使用
appsettings
文件没有描述 MyAppTablesConnectionString
- 并且您不通过环境变量传递此值。
我尝试为我的 ASP.NET Core 2.0 应用程序设置 "dev" 和 "prod" 环境,但它不起作用...这是我的配置:
appsettings.json
内容(与appsettings.Development.json
完全相同)
{
"Logging": {
"IncludeScopes": false,
"LogLevel": { "Default": "Warning" }
},
"ConnectionStrings": {
"MyAppContext":
"...AccountName=MyApptables4dev; AccountKey=xxxxxx==;EndpointSuffix=core.windows.net"
},
"Authentication": {
"AzureAd": {
"AADInstance": "https://login.microsoftonline.com/",
"CallbackPath": "/signin-oidc",
"ClientId": "xxxxxxx",
"Domain": "MyAppapp-dev.azurewebsites.net",
"TenantId": "yyyyyyy"
}
}
}
对于 appsettings.Production.json
仅连接字符串和域名更改:
"MyAppContext":"...AccountName=MyApptables4dev;AccountKey=yyyyyy==;EndpointSuffix=core..."
和
"Domain": "MyAppapp.azurewebsites.net",
Startup.cs
:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
builder = builder.AddUserSecrets<Startup>();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
// Adds services required for using options.
services.AddOptions();
// Register the IConfiguration instance which "ConnectionStrings" binds against.
//services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
services.Configure<AppSecrets>(Configuration);
services.AddSingleton<ITableRepositories, TableClientOperationsService>();
// ...
secrets.json
(位于用户文件夹)内容
{
"MyAppTablesConnectionString": "DefaultEndpointsProtocol=https;AccountName=myapptables4dev;AccountKey=xxx==;EndpointSuffix=core.windows.net"
}
最后 Class 访问数据库(在我的例子中是 AzureTables)
public class TableClientOperationsService : ITableRepositories
{
// ...
public TableClientOperationsService() { }
public TableClientOperationsService(IOptions<AppSecrets> optionsAccessor)
{
tables = new Dictionary<string, CloudTable>();
// 'null' in 'prod'!
connectionString = optionsAccessor.Value.MyAppTablesConnectionString;
}
知道 MyAppTablesConnectionString
在 "Production" 中是 "null",也许问题出在这里,但我不知道如何让它与 [=25= 一起工作] 和 MyAppTablesConnectionString
连接字符串...
因此您的代码从 MyAppTablesConnectionString
设置中读取值:
connectionString = optionsAccessor.Value.MyAppTablesConnectionString;
但根据提供的信息,只有 dev env 有此设置(通过 secret.json 定义并由 builder = builder.AddUserSecrets<Startup>();
读取)。
是的,生产环境得到了 null
,因为该设置未在任何配置源中定义:
- 用户密码不与产品一起使用
appsettings
文件没有描述MyAppTablesConnectionString
- 并且您不通过环境变量传递此值。