অজুর অ্যাপ কনফিগারেশন থেকে ডায়নামিকভাবে। নেট কোর কনফিগারেশন আপডেট করুন


9

আমি যা করার চেষ্টা করছি : অ্যাজুরে অ্যাপ কনফিগারেশনে একটি সেন্ডিনেল কী দিয়ে নেট নেট 2.1 এমভিসি ওয়েব অ্যাপ্লিকেশন সহ আজুর অ্যাপ কনফিগারেশন সেটআপ করার চেষ্টা করছি, এবং কীগুলির কোনওটিই নয় সেন্ডিনেলের মান পরিবর্তন না হওয়া পর্যন্ত আমার অ্যাপ্লিকেশনগুলিতে আপডেট হবে। তাত্ত্বিকভাবে, এটির সাহায্যে নিরাপদে গরম অদলবদলের কনফিগারেশনের অনুমতি দেওয়া উচিত।

আমার সমস্যাটি কী: আমি যখন এটি করি তখন IWebHostBuilder এর প্রেরণিকাটি দেখার জন্য কোনও ওয়াচএন্ডরেলোএডল () পদ্ধতি উপলব্ধ নেই এবং বিকল্প রিফ্রেশ () পদ্ধতিগুলি তারা জানায় না যে তারা কনফিগারেশনটিকে রিফ্রেশ করে।

পটভূমি তথ্য এবং আমি যা চেষ্টা করেছি: আমি গত সপ্তাহে ভিএস লাইভ - সান দিয়েগোতে অংশ নিয়েছি এবং অ্যাজুরে অ্যাপ কনফিগারেশনের একটি ডেমো দেখেছি। আমি কিছু যখন এটি implimenting রিফ্রেশ কনফিগ মান অ্যাপ্লিকেশন, পেতে তাই আমি এই রেফারেন্সড চেষ্টা সমস্যা ডেমো কিভাবে পাশাপাশি এই কাজ করতে বর্ণনা। প্রাসঙ্গিক বিভাগটি প্রায় 10 মিনিটের মধ্যে হয়। তবে, এই পদ্ধতিটি আইওবহস্টবিল্ডারে উপলব্ধ বলে মনে হয় না।

ডকুমেন্টেশন আমি উল্লেখ করছি: অফিসিয়াল ডকুমেন্টেশনে এই পদ্ধতির কোনও রেফারেন্স নেই ডক কুইকস্টার্ট। নেট কোর এবং ডক ডায়নামিক কনফিগারেশন। নেট কোর দেখুন

আমার পরিবেশ: মাইক্রোসফ্টের জন্য সর্বশেষ পূর্বরূপ নুগেট প্যাকেজ সহ ডু নেট নেট ২.১ ব্যবহার করে ভিজ্যুয়াল স্টুডিও এন্টারপ্রাইজ 2019 থেকে চালিত হচ্ছে spএএসপেট.এপস কনফিগারেশন.এএসপনেটকোর 2.0.0-প্রাকদর্শন -010060003-1250

আমার কোড: ডেমোতে, তারা এভাবে তৈরি করুন ওয়েবেহোস্টবিল্ডার (স্ট্রিং [] আরগস) পদ্ধতির মাধ্যমে একটি আইওয়েবহোস্টবিল্ডার তৈরি করেছে:

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();
        config.AddAzureAppConfiguration(options =>
        {
            options.Connect(settings["ConnectionStrings:AzureConfiguration"])
            .Use(keyFilter: "TestApp:*")
            .WatchAndReloadAll(key: "TestApp:Sentinel", pollInterval: TimeSpan.FromSeconds(5));
        }); 
    })
    .UseStartup<Startup>();
}

আমি বর্তমান ডকুমেন্টেশন ব্যবহার করে এটিও এভাবে চেষ্টা করেছি:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();

        config.AddAzureAppConfiguration(options =>
        {
            // fetch connection string from local config. Could use KeyVault, or Secrets as well.
            options.Connect(settings["ConnectionStrings:AzureConfiguration"])
            // filter configs so we are only searching against configs that meet this pattern
            .Use(keyFilter: "WebApp:*")
            .ConfigureRefresh(refreshOptions =>
            { 
                // In theory, when this value changes, on the next refresh operation, the config will update all modified configs since it was last refreshed.
                refreshOptions.Register("WebApp:Sentinel", true);
                refreshOptions.Register("WebApp:Settings:BackgroundColor", false);
                refreshOptions.Register("WebApp:Settings:FontColor", false);
                refreshOptions.Register("WebApp:Settings:FontSize", false);
                refreshOptions.Register("WebApp:Settings:Message", false);
            });
        });
    })
    .UseStartup<Startup>();

তারপরে, আমার স্টার্টআপ ক্লাসে:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<Settings>(Configuration.GetSection("WebApp:Settings"));
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseAzureAppConfiguration();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

এবং অবশেষে আমার সেটিংস কনফিগার মডেল:

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

এখন, আমার নিয়ামকটিতে, আমি সেই সেটিংসটি টানছি এবং এগুলি ভিউতে প্রদর্শিত হওয়ার জন্য একটি ভিউ ব্যাগে ফেলে দিই।

public class HomeController : Controller
{
    private readonly Settings _Settings;

    public HomeController(IOptionsSnapshot<Settings> settings)
    {
        _Settings = settings.Value;
    }

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

        return View();
    }
}

পরিবর্তনগুলি প্রদর্শন করার জন্য একটি সাধারণ দৃশ্য:

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

আমি এটি প্রথমবারের মতো কনফিগারটি টেনে আনতে পারি, তবে রিফ্রেশ কার্যকারিতা কোনওভাবেই কাজ করে না বলে মনে হয়।

শেষ উদাহরণে, আমি যখন সেন্ডিনেলটি কোনও নতুন মান সেট করা হয়েছিল বা খুব কমপক্ষে, কোনও মান পরিবর্তিত হওয়ার 30 সেকেন্ড পরে আপডেট করার জন্য কনফিগারগুলি আপডেট করার প্রত্যাশা করেছিল। অপেক্ষার কোনও দৈর্ঘ্য মানগুলি আপডেট করে না, এবং কেবলমাত্র একটি সম্পূর্ণ শাট ডাউন এবং অ্যাপ্লিকেশনটির পুনঃসূচনা নতুন কনফিগারেশন লোড করে।

আপডেট: অ্যাপ্লিকেশন যুক্ত করা হচ্ছে Uউসেজুর অ্যাপস কনফিগারেশন (); প্রারম্ভকালে কনফিগার পদ্ধতিতে এবং কনফিগারেশনের জন্য ক্যাশে একটি স্পষ্ট টাইমআউট সেট করে নির্দিষ্ট সময়ের পরে রিফ্রেশ করার পদ্ধতিটি রিফ্রেশ করে দেয় তবে সেন্ডিনেল কার্যকারিতা এখনও কার্যকর হয় না এবং পুনরায় রিফ্রেশ পদ্ধতিতে আপডেট সমস্ত পতাকা কার্যকর করে না।


আপনি কীভাবে এবং কোথায় আপনি কনফিগারেশন অ্যাক্সেস করতে পারেন তা আমাকে দেখাতে পারেন? আমি আমার নিজের প্রকল্পে আপনার পরিস্থিতি অনুকরণ করেছি এবং এটি পুরোপুরি কাজ করে
পিটার বনস

আমি আপনার ConfigureServicesপদ্ধতিটি শুরু করার জন্য কোথাও কিছু কনফিগারেশন বাধ্যতামূলক বলে আশা করেছি, যেমনservices.Configure<LogSettings>(configuration.GetSection("LogSettings"));
পিটার

@ পেটারবোনস আপনার লিঙ্কটি আমাকে 404
নিক নিক গাসিয়া রবিটস

@ পিটারবোনস কনফিগারেশন ইনজেকশন / বাইন্ডিং সম্পর্কিত অনুরোধিত তথ্য অন্তর্ভুক্ত করার জন্য আমি আমার পোস্ট আপডেট করেছি। আমি ভাবিনি যে এটি তখন সুপ্রসন্ন ছিল কারণ এটি কাজ করছিল।
নিক গ্যাসিয়া রবিতচ

1
ঐটা এটা ছিল. আপনাকে স্বাগতম.
পিটার বনস

উত্তর:


6

ঠিক আছে, অনেক পরীক্ষার পরে এবং পরীক্ষা এবং ত্রুটি পরে, আমি এটি কাজ করে।

আমার ইস্যুটি কনফিগার পদ্ধতিতে অ্যাজুরের জন্য একটি অনুপস্থিত পরিষেবা ছিল। এখানে কিছু আকর্ষণীয় আচরণ রয়েছে, এটি এখনও সেটিংসটি নীচে টেনে আনবে, এটি কেবল আপডেট হয় না, যদি এটি অনুপস্থিত থাকে। সুতরাং একবার এটি স্থাপন করা হয়েছিল এবং প্রতি ডকুমেন্টেশন অনুসারে যথাযথ সেন্ডিনেল কনফিগার করা থাকলে এটি আপডেটের সমস্ত পতাকা নিয়ে কাজ করে। তবে এটি বর্তমানে নথিভুক্ত নয়।

সমাধান এখানে:

প্রোগ্রাম.সি তে:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;

namespace ASPNetCoreApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }   // Main

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var settings = config.Build();

                config.AddAzureAppConfiguration(options =>
                {
                    // fetch connection string from local config. Could use KeyVault, or Secrets as well.
                    options.Connect(settings["ConnectionStrings:AzureConfiguration"])
                    // filter configs so we are only searching against configs that meet this pattern
                    .Use(keyFilter: "WebApp:*")
                    .ConfigureRefresh(refreshOptions =>
                    { 
                        // When this value changes, on the next refresh operation, the config will update all modified configs since it was last refreshed.
                        refreshOptions.Register("WebApp:Sentinel", true);
                        // Set a timeout for the cache so that it will poll the azure config every X timespan.
                        refreshOptions.SetCacheExpiration(cacheExpirationTime: new System.TimeSpan(0, 0, 0, 15, 0));
                    });
                });
            })
            .UseStartup<Startup>();
    }
}

তারপরে শুরুতে:

using ASPNetCoreApp.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace ASPNetCoreApp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // bind the config to our DI container for the settings we are pulling down from azure.
            services.Configure<Settings>(Configuration.GetSection("WebApp:Settings"));
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            // Set the Azure middleware to handle configuration
            // It will pull the config down without this, but will not refresh.
            app.UseAzureAppConfiguration();
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

সেটিংস মডেলটিতে আমি আমার অজুর পুনরুদ্ধার করা ডেটা বাইনড করছি:

namespace ASPNetCoreApp.Models
{
    public class Settings
    {
        public string BackgroundColor { get; set; }
        public long FontSize { get; set; }
        public string FontColor { get; set; }
        public string Message { get; set; }
    }
}

কনফিগারেশন সহ একটি জেনেরিক হোম নিয়ামক আমাদের ভিউতে প্রবেশ করতে ভিউব্যাগে সেট করা হচ্ছে:

using ASPNetCoreApp.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System.Diagnostics;

namespace ASPNetCoreApp.Controllers
{
    public class HomeController : Controller
    {
        private readonly Settings _Settings;

        public HomeController(IOptionsSnapshot<Settings> settings)
        {
            _Settings = settings.Value;
        }
        public IActionResult Index()
        {
            ViewData["BackgroundColor"] = _Settings.BackgroundColor;
            ViewData["FontSize"] = _Settings.FontSize;
            ViewData["FontColor"] = _Settings.FontColor;
            ViewData["Message"] = _Settings.Message;

            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

আমাদের দেখুন:

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

আশাকরি ইহা অন্য কারো সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.