116

Using ASP.NET Mvc Core I needed to set my development environment to use https, so I added the below to the Main method in Program.cs:

var host = new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseKestrel(cfg => cfg.UseHttps("ssl-dev.pfx", "Password"))
                .UseUrls("https://localhost:5000")
                .UseApplicationInsights()
                .Build();
                host.Run();

How can I access the hosting environment here so that I can conditionally set the protocol/port number/certificate?

Ideally, I would just use the CLI to manipulate my hosting environment like so:

dotnet run --server.urls https://localhost:5000 --cert ssl-dev.pfx password

but there doesn't seem to be way to use a certificate from the command line.

Henk Mollema
  • 44,194
  • 12
  • 93
  • 104
Mike Lunn
  • 2,310
  • 3
  • 21
  • 24

3 Answers3

222

I think the easiest solution is to read the value from the ASPNETCORE_ENVIRONMENT environment variable and compare it with Environments.Development:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var isDevelopment = environment == Environments.Development;

.NET 6 or higher

Starting from .NET 6 using the new application bootstrapping model you can access the environment from the application builder:

var builder = WebApplication.CreateBuilder(args);
var isDevelopment = builder.Environment.IsDevelopment();
Henk Mollema
  • 44,194
  • 12
  • 93
  • 104
  • 2
    I forgot about about System.Environment. Thanks! – Mike Lunn Jun 08 '17 at 14:11
  • 18
    Note that in .NET Core 3.0+, the `EnvironmentName` class is marked as obsolete (https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.environmentname?view=dotnet-plat-ext-3.1), with the recommendation you switch to the `Environments` class (https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.environments?view=dotnet-plat-ext-3.1). – Blair Allen Jan 13 '20 at 17:39
  • 11
    This only works when environment is set by the environment variable. It's also possible to set it from the command line with `--environment "Development"` for example – tjmoore Sep 04 '20 at 18:50
  • How would you do this if you're not using asp.net at all? Like if it's just a console app? – Joe Phillips Dec 17 '21 at 20:02
  • Been searching the internet for this for an hour or so now and just found this simple solution! Thanks so much! I needed this for EF method override of OnConfiguring(DbContextOptionsBuilder optionsBuilder) – Kevin Dark Jan 04 '23 at 23:37
32

[New Answer using ASP 6.0 minimal API]:

If you are using ASP 6.0 minimal API it's very simple by using WebApplication.Environment:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

if (!app.Environment.IsProduction())
{
    // ...
}

app.MapGet("/", () => "Hello World!");

app.Run();

======================================

[Old Answer]

This is my solution (written for ASP.NET Core 2.1):

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var hostingEnvironment = services.GetService<IHostingEnvironment>();
        
        if (!hostingEnvironment.IsProduction())
           SeedData.Initialize();
    }

    host.Run();
}
HamedH
  • 2,814
  • 1
  • 26
  • 37
  • 14
    The problem with this is it creates an entire instance of the application and destroys it again just to get the Environment name. Very heavy handed. – Steed Sep 18 '18 at 11:23
  • 3
    @steed given that this is a clean way to get the IHostingEnvironment and it is only done once before Run() I would say it's neglectable if it's a bit "heavy handed". – Felix K. Oct 15 '18 at 15:40
  • 2
    Need access to it before web host builder Build is caleld – jjxtra Sep 08 '19 at 22:13
  • 3
    @Steed util you don't call Run, as in CreateHostBuilder(args).Build().Run(), you aren't really creating the entire instance of the application, you just created the host, and requested an instance of IHostingEnvironment – jlchavez Jun 08 '20 at 20:15
  • 3
    `IHostingEnvironment` has been deprecated and can be replaced with `Microsoft.AspNetCore.Hosting.IWebHostEnvironment` or `Microsoft.Extensions.Hosting.IHostEnvironment` – jhhwilliams May 26 '21 at 09:11
  • 2
    Not sure about previous versions, but in .NET7, as soon as I call CreateBuilder, I seem to have access to builder.Environment.EnvironmentName. This is before ever calling builder.Build(). – kman Dec 01 '22 at 16:05
11

In .NET core 3.0

using System;
using Microsoft.Extensions.Hosting;

then

var isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development;
Moses Machua
  • 11,245
  • 3
  • 36
  • 50