ConfigureServices में विकास / मंचन / उत्पादन होस्टिंग पर्यावरण कैसे प्राप्त करें


171

ConfigureServicesस्टार्टअप में विधि में विकास / स्टेजिंग / उत्पादन होस्टिंग पर्यावरण कैसे प्राप्त करूं ?

public void ConfigureServices(IServiceCollection services)
{
    // Which environment are we running under?
}

ConfigureServicesविधि केवल एक ही ले जाता है IServiceCollectionपैरामीटर।


4
IHostingEnvironmentसिर्फ कॉन्फिगर सर्विसेज में इंजेक्ट क्यों नहीं किया जा सकता है? निरीक्षण? या हमें इसके बारे में पता होना चाहिए?
साइमन_वेवर

जवाबों:


225

आप इसे कॉन्फिगरस्वाइस में आसानी से एक्सेस कर सकते हैं, बस इसे स्टार्टअप मेथड के दौरान एक प्रॉपर्टी पर टिकाएं जिसे पहले कहा जाता है और इसमें पास हो जाता है, फिर आप कन्फिगरस् सर्विसेज से प्रॉपर्टी को एक्सेस कर सकते हैं।

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    ...your code here...
    CurrentEnvironment = env;
}

private IHostingEnvironment CurrentEnvironment{ get; set; } 

public void ConfigureServices(IServiceCollection services)
{
    string envName = CurrentEnvironment.EnvironmentName;
    ... your code here...
}

13
डॉक्स के अनुसार , इस विधि का उपयोग नहीं किया जाना चाहिए। आपको इसके बजाय उपयोग करना चाहिए CurrentEnvironment.IsEnvironment("environmentname")
vaindil

28
या CurrentEnvironment.IsDevelopment()/CurrentEnvironment.IsProduction()
सिमोन_वेर 5

3
@vaindil - आपके द्वारा संदर्भित डॉक्स इस विधि का उपयोग नहीं किया जाना चाहिए। आपका उदाहरण बस आवरण की उपेक्षा करता है, जो कई मामलों में बेहतर है, लेकिन एक आज्ञा नहीं है
Coruscate5

3
@ Coruscate5 ठीक है, यह स्पष्ट रूप से इस पद्धति का उपयोग नहीं करने के लिए नहीं कहता है, लेकिन यह अन्य विधि INSTEAD का उपयोग करने के लिए कहता है। वस्तुतः वही बात है।
vaindil

8
पदावनत IHostingEnvironment env इसके स्थान पर IWebHostEnvironment env का उपयोग करें
मार्क Schultheiss

56

टी एल; डॉ

एक पर्यावरण चर सेट करें जिसे पर्यावरण ASPNETCORE_ENVIRONMENTके नाम से पुकारा जाता है (जैसे Production)। फिर दो काम करें:

  • सुई IHostingEnvironmentमें Startup.csहै, तो उस का उपयोग करें ( envजाँच करने के लिए यहाँ): env.IsEnvironment("Production")। का उपयोग कर की जाँच नहीं हैenv.EnvironmentName == "Production" !
  • अलग-अलग Startupकक्षाओं या व्यक्ति Configure/ ConfigureServicesकार्यों का उपयोग करें । यदि कोई वर्ग या फ़ंक्शंस इन प्रारूपों से मेल खाते हैं, तो उनका उपयोग उस वातावरण पर मानक विकल्पों के बजाय किया जाएगा।
    • Startup{EnvironmentName}() (संपूर्ण वर्ग) || उदाहरण:StartupProduction()
    • Configure{EnvironmentName}()|| उदाहरण:ConfigureProduction()
    • Configure{EnvironmentName}Services()|| उदाहरण:ConfigureProductionServices()

पूरी व्याख्या

.NET कोर डॉक्स यह बताते हैं कि इसे कैसे पूरा किया जाए । पर्यावरण चर का उपयोग करें जिसे ASPNETCORE_ENVIRONMENTआप चाहते हैं कि पर्यावरण के लिए सेट है, तो आपके पास दो विकल्प हैं।

पर्यावरण नाम की जाँच करें

डॉक्स से :

IHostingEnvironmentसेवा वातावरण के साथ काम करने के लिए कोर अमूर्त प्रदान करता है। यह सेवा ASP.NET होस्टिंग परत द्वारा प्रदान की जाती है, और आपके स्टार्टअप तर्क में निर्भरता इंजेक्शन के माध्यम से इंजेक्ट किया जा सकता है। Visual Studio में ASP.NET कोर वेब साइट टेम्पलेट पर्यावरण-विशिष्ट कॉन्फ़िगरेशन फ़ाइलों (यदि मौजूद है) को लोड करने और ऐप की त्रुटि सेटिंग्स को अनुकूलित करने के लिए इस दृष्टिकोण का उपयोग करता है। दोनों मामलों में, यह व्यवहार कॉल करके EnvironmentNameया वर्तमान में निर्दिष्ट वातावरण का संदर्भ देकर प्राप्त किया जाता हैIsEnvironmentIHostingEnvironment उपयुक्त विधि में पारित होने के उदाहरण पर ।

नोट: वास्तविक मूल्य जाँच हो रही है की env.EnvironmentNameहै नहीं की सिफारिश की!

यदि आपको यह जांचने की आवश्यकता है कि क्या एप्लिकेशन किसी विशेष वातावरण में चल रहा है, तो इसका उपयोग करें env.IsEnvironment("environmentname")क्योंकि यह सही ढंग से मामले को अनदेखा करेगा (यदि जाँचने के बजाय)env.EnvironmentName == "Development" उदाहरण के लिए )।

अलग-अलग कक्षाओं का उपयोग करें

डॉक्स से :

जब एक ASP.NET कोर अनुप्रयोग शुरू होता है, तो Startupक्लास का उपयोग एप्लिकेशन को बूटस्ट्रैप करने के लिए किया जाता है, इसकी कॉन्फ़िगरेशन सेटिंग्स को लोड किया जाता है, आदि ( ASP.NET स्टार्टअप के बारे में और जानें )। हालाँकि, यदि कोई वर्ग नाम Startup{EnvironmentName}(उदाहरण के लिए StartupDevelopment) मौजूद है , और ASPNETCORE_ENVIRONMENTपर्यावरण चर उस नाम से मेल खाता है, तो Startupइसके बजाय उस वर्ग का उपयोग किया जाता है। इस प्रकार, आप Startupविकास के लिए कॉन्फ़िगर कर सकते हैं , लेकिन एक अलग हैStartupProduction है जिसका उपयोग तब किया जाता है जब एप्लिकेशन उत्पादन में चलाया जाता है। या ठीक इसके विपरीत।

Startupवर्तमान परिवेश के आधार पर एक पूरी तरह से अलग वर्ग का उपयोग करने के अलावा , आप यह भी समायोजन कर सकते हैं कि किसी Startupवर्ग के भीतर एप्लिकेशन को कैसे कॉन्फ़िगर किया जाए । Configure()और ConfigureServices()तरीकों के समान वातावरण-विशिष्ट संस्करणों का समर्थन Startupवर्ग ही है, फार्म की Configure{EnvironmentName}()और Configure{EnvironmentName}Services()। यदि आप एक विधि को परिभाषित ConfigureDevelopment()करते हैं Configure()तो इसे पर्यावरण के विकास पर सेट होने के बजाय कहा जाएगा । इसी तरह, एक ही वातावरण के ConfigureDevelopmentServices()बजाय बुलाया जाएगा ConfigureServices()


29

में .NET Core 2.0MVC एप्लिकेशन /Microsoft.AspNetCore.All v2.0.0, आप पर्यावरण विशिष्ट स्टार्टअप वर्ग के रूप में @vaindil द्वारा वर्णित हो सकता है लेकिन मैं उस दृष्टिकोण की तरह नहीं है।

आप कंस्ट्रक्टर IHostingEnvironmentमें भी इंजेक्ट कर सकते हैं StartUp। आपको Programकक्षा में पर्यावरण चर को संग्रहीत करने की आवश्यकता नहीं है ।

public class Startup
{
    private readonly IHostingEnvironment _currentEnvironment;
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        _currentEnvironment = env;
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        ......

        services.AddMvc(config =>
        {
            // Requiring authenticated users on the site globally
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));

            // Validate anti-forgery token globally
            config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

            // If it's Production, enable HTTPS
            if (_currentEnvironment.IsProduction())      // <------
            {
                config.Filters.Add(new RequireHttpsAttribute());
            }            
        });

        ......
    }
}

1
विवरण इसमें देखे जा सकते हैं: docs.microsoft.com/pt-br/aspnet/core/fundamentals/…
एन्ड्रे मोरालेस

यहाँ André द्वारा पोस्ट किया गया अंग्रेजी लिंक है: docs.microsoft.com/en-us/aspnet/core/fundamentals/…
ahong

1
पदावनत IHostingEnvironment env इसके स्थान पर IWebHostEnvironment env का उपयोग करें
मार्क Schultheiss

21

यह बिना किसी अतिरिक्त गुण या विधि मापदंडों के पूरा किया जा सकता है, जैसे:

public void ConfigureServices(IServiceCollection services)
{
    IServiceProvider serviceProvider = services.BuildServiceProvider();
    IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();

    if (env.IsProduction()) DoSomethingDifferentHere();
}

2
अब तक का सबसे अच्छा जवाब। थैंक्स
Shady Sherif

7
यह .NET कोर 3.0 में निम्नलिखित चेतावनी को फेंकता है: सिंगल कोड की एक अतिरिक्त प्रतिलिपि में बनाई जा रही एप्लिकेशन कोड के परिणाम से 'BuildServiceProvider' का निर्माण किया जा रहा है। 'कॉन्फिगर' के मापदंडों के रूप में निर्भरता इंजेक्शन सेवाओं जैसे विकल्पों पर विचार करें।
शाश्वत

2
पदावनत IHostingEnvironment env इसके स्थान पर IWebHostEnvironment env का उपयोग करें
मार्क Schultheiss

19

यदि आपको अपने कोडबेस में कहीं ऐसा परीक्षण करने की आवश्यकता है जिसमें IHostingEnvironment की आसान पहुँच नहीं है, तो ऐसा करने का एक और आसान तरीका इस प्रकार है:

bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";

अच्छा, कम रास्ता! ध्यान रखें कि चर नाम "asp.net core" और "asp.net" के बीच भिन्न है
nmDat

15

डॉक्स के अनुसार

कॉन्फ़िगर करें और कॉन्फ़िगर करें प्रपत्र के विशिष्ट संस्करणों में पर्यावरण का समर्थन करें कॉन्फ़िगर करें {EnvironmentName} और कॉन्फ़िगर करें {EnvironmentName} सेवाएं:

आप ऐसा कुछ कर सकते हैं ...

public void ConfigureProductionServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for production
    services.Configure();
}

public void ConfigureDevelopmentServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for development
    services.Configure();
}

public void ConfigureStagingServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for staging
    services.Configure();
}

private void ConfigureCommonServices(IServiceCollection services)
{
    //Services common to each environment
}

1
यह सबसे अच्छा सम्मेलन है
स्टुअर्ट.सकलिनार

11

मैं अपनी एक सेवा में पर्यावरण प्राप्त करना चाहता था। यह वास्तव में करना आसान है! मैं इसे इस तरह से निर्माता को इंजेक्ट करता हूं:

    private readonly IHostingEnvironment _hostingEnvironment;

    public MyEmailService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

अब बाद में कोड में मैं यह कर सकता हूं:

if (_hostingEnvironment.IsProduction()) {
    // really send the email.
}
else {
    // send the email to the test queue.
}

संपादित करें:

ऊपर कोड .NET Core के लिए है। संस्करण 3 के लिए आप उपयोग करना चाहेंगे IWebHostEnvironment


5

होस्टिंग वातावरण ASPNET_ENV पर्यावरण चर से आता है, जो IHostingEnvironment.IsEnvironment विस्तार विधि, या IsDevelopment या IsProduction की इसी सुविधा विधियों में से एक का उपयोग करके स्टार्टअप के दौरान उपलब्ध है। या तो आपको स्टार्टअप (), या कॉन्फिगर सर्विसेज कॉल में क्या चाहिए:

var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");

IHostingEnvironmentमें उपलब्ध नहीं है ConfigureServices
मुहम्मद रेहान सईद

1
नहीं यह नहीं। इससे निपटने के तरीके के बारे में मेरे जवाब को देखें।
जेफ डनलप

8
पर्यावरण चर अब "ASPNETCORE_ENVIRONMENT" है
एंथनी

पदावनत IHostingEnvironment env उपयोग IWebHostEnvironment env का उपयोग करें
मार्क Schultheiss

5

बस किसी मामले में यह भी देख रहा है। इननेट कोर 3+ इसमें से अधिकांश अप्रचलित है। अद्यतन तरीका है:

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env,
    ILogger<Startup> logger)
{
    if (env.EnvironmentName == Environments.Development)
    {
        // logger.LogInformation("In Development environment");
    }
}

2

डॉटनेट कोर 2.0 में स्टार्टअप-कंस्ट्रक्टर केवल एक IConfiguration- पैरामीटर की अपेक्षा करता है।

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

वहां होस्टिंग का माहौल कैसे पढ़ें? मैं इसे कॉन्फ़िगर-कॉन्फिगरेशन के दौरान प्रोग्राम-क्लास में स्टोर करता हूं (WebHost.CreateDefaultBuilder के बजाय पूर्ण BuildWebHost का उपयोग करें):

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }

    public static void Main(string[] args)
    {
        // Build web host
        var host = BuildWebHost(args);

        host.Run();
    }

    public static IWebHost BuildWebHost(string[] args)
    {
        return new WebHostBuilder()
            .UseConfiguration(new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("hosting.json", optional: true)
                .Build()
            )
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var env = hostingContext.HostingEnvironment;

                // Assigning the environment for use in ConfigureServices
                HostingEnvironment = env; // <---

                config
                  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

                if (env.IsDevelopment())
                {
                    var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                    if (appAssembly != null)
                    {
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }

                config.AddEnvironmentVariables();

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
            })
            .ConfigureLogging((hostingContext, builder) =>
            {
                builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                builder.AddConsole();
                builder.AddDebug();
            })
            .UseIISIntegration()
            .UseDefaultServiceProvider((context, options) =>
            {
                options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
            })
            .UseStartup<Startup>()
            .Build();
    }

चींटी इसे इस तरह से कॉन्फ़िगर कॉन्फ़िगर सेवाओं में पढ़ती है:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    var isDevelopment = Program.HostingEnvironment.IsDevelopment();
}

पदावनत IHostingEnvironment env इसके स्थान पर IWebHostEnvironment env का उपयोग करें
मार्क Schultheiss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.