Изменение отображения службы конфигурации приложений Azure в MVC app .NET Core 3.x без обновления страницы

#asp.net-mvc #asp.net-core-3.1 #.net-core-3.1 #azure-app-configuration

#asp.net-mvc #asp.net-ядро-3.1 #.net-core-3.1 #azure-app-configuration

Вопрос:

Что я пытаюсь сделать: я настроил конфигурацию приложения Azure с помощью веб-приложения .net core 3.1 mvc с помощью контрольного ключа в конфигурации приложения Azure, с целью того, чтобы по мере обновления значений разных ключей вместе с их контрольными ключами обновленное значение должно отражаться в моем приложении mvc без обновления Страницы.

В чем моя проблема: когда я делаю это с помощью RefreshAll: true внутри опции dependency Injection в моем классе Program.cs, я могу просмотреть изменения в своем приложении после обновления страницы, но я хочу увидеть изменения, как только я обновлю значение ключа в моей службе конфигурации приложения (без обновления страницы)

Документация, на которую я ссылаюсь: https://learn.microsoft.com/en-us/azure/azure-app-configuration/enable-dynamic-configuration-aspnet-core?tabs=core3x#reload-data-from-app-configuration Я создал приложение, используя только приведенную выше ссылку. Моя среда: использование dot net core 3.1, запускаемого из Visual Studio Enterprise 2019

Мой код: Programe.cs —

 public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
            webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
            {
                var settings = config.Build();
                config.AddAzureAppConfiguration(options =>
                {
                    options.Connect(settings["ConnectionStrings:AppConfig"])
                           .ConfigureRefresh(refresh =>
                                {
                                    refresh.Register("TestApp:Settings:Sentinel", refreshAll: true)
                                           .SetCacheExpiration(new TimeSpan(0, 0, 1));
                                });
                });
            })
        .UseStartup<Startup>());
  

Добавлен класс Setting.cs :

 namespace TestAppConfig
{
    public class Settings
    {
        public string BackgroundColor { get; set; }
        public long FontSize { get; set; }
        public string FontColor { get; set; }
        public string Message { get; set; }
    }
}
  

в Startup.cs изменен метод ConfigureService :

 public void ConfigureServices(IServiceCollection services)
{
    services.Configure<Settings>(Configuration.GetSection("TestApp:Settings"));
    services.AddControllersWithViews();
}
  

Также обновлен метод настройки как :

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        // Add the following line:
        app.UseAzureAppConfiguration();

        app.UseHttpsRedirection();

        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
}
  

Мой класс HomeController :

 public class HomeController : Controller
{
    private readonly Settings _settings;
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger, IOptionsSnapshot<Settings> settings)
    {
        _logger = logger;
        _settings = settings.Value;
    }

    public IActionResult Index()
    {
        ViewData["BackgroundColor"] = _settings.BackgroundColor;
        ViewData["FontSize"] = _settings.FontSize;
        ViewData["FontColor"] = _settings.FontColor;
        ViewData["Message"] = _settings.Message;

        return View();
    }

    // ...
}
  

Индекс.cshtml :

 <!DOCTYPE html>
<html lang="en">
<style>
    body {
        background-color: @ViewData["BackgroundColor"]
    }
    h1 {
        color: @ViewData["FontColor"];
        font-size: @ViewData["FontSize"]px;
    }
</style>
<head>
    <title>Index View</title>
</head>
<body>
    <h1>@ViewData["Message"]</h1>
</body>
</html>
  

Дайте мне знать , можно ли этого достичь и как .
Заранее спасибо

Ответ №1:

В реальном мире при изменении конфигурации новые пользователи вашего веб-приложения увидят изменения. Если вы хотите увидеть изменения без обновления страницы, вам придется использовать javascript или AJAX для автоматического обновления страницы, например, по таймеру. Это ничем не отличается, когда что-либо изменяется на стороне сервера, независимо от того, конфигурация это или что-то еще.