Я хотел бы изменить строки подключения, помещенные в appsettings. json файл во время выполнения в NET Core 2.2.
Итак, моя работа:
- Изменить строку подключения в настройках приложения. json во время выполнения
- Перезагрузить класс конфигурации, чтобы получить измененную строку подключения
- Refre sh весь datacontext для использования новой строки подключения
Я думаю, что 1. шаг в порядке, я использую этот код и appsettings. json успешно изменяется:
public static void ChangeConnectionStringsInAppSettings(eConnectionStringType cstrType, string value)
{
var d = AppDomain.CurrentDomain.BaseDirectory;
ChangeSettingsFile(Path.Combine(d, "appsettings.json"), cstrType, value);
ChangeSettingsFile(Path.Combine(d, "appsettings.Development.json"), cstrType, value);
ChangeSettingsFile(Path.Combine(d, "appsettings.Production.json"), cstrType, value);
}
private static void ChangeSettingsFile(string appSettingsJsonFilePath, eConnectionStringType cstrType, string value)
{
if (System.IO.File.Exists(appSettingsJsonFilePath))
{
var json = System.IO.File.ReadAllText(appSettingsJsonFilePath);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(json);
if (cstrType == eConnectionStringType.Identity)
{
jsonObj["ConnectionStrings"]["IdentityConnection"] = value;
}
else if (cstrType == eConnectionStringType.Data)
{
jsonObj["ConnectionStrings"]["DefaultConnection"] = value;
}
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);
System.IO.File.WriteAllText(appSettingsJsonFilePath, output);
}
}
С setp 2 и 3 у меня проблема. Я пытаюсь заставить работать IOptionsMonitor с DI, но он всегда показывает старое значение:
public class Startup
{
public class ConnectionStrings
{
public string IdentityConnection { get; set; }
}
public void ConfigureServices(IServiceCollection services)
// ...
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
// ...
}
}
Контроллер:
public RolesController(
AuthContext ACTX
, MySiteContext CTX
, UserManager<ApplicationUser> userManager
, RoleManager<ApplicationRole> roleManager
, IConfiguration configuration
, IStringLocalizer localizer
, My my
, IRolesRepository repo
, IOptionsMonitor<ConnectionStrings> options)
: base(ACTX, CTX, userManager, roleManager, configuration, localizer, my, repo)
{
var _myValues = options.CurrentValue;
}
[UseAjax]
[UseTelerik]
[UseClientSideValidation]
public IActionResult Index()
{
ChangeConnectionStringsInAppSettings(eConnectionStringType.Identity, "old");
this.CheckDatabase();
return View(new ApplicationRoleDto());
}
[UseAjax]
[UseTelerik]
[UseClientSideValidation]
public IActionResult Index2()
{
ChangeConnectionStringsInAppSettings(eConnectionStringType.Identity, "new");
this.CheckDatabase();
return View("Index",new ApplicationRoleDto());
}
Я остановился на этом шаге. Новое значение не загружается, и после того, как мне это удастся, мне нужно установить новые строки подключения для всего текста данных.
Не могли бы вы помочь мне, пожалуйста? Спасибо!