ASP.NET Core - Program.cs
ASP.NET Core web application is actually a console project which starts executing from the entry point
public static void Main()
in Program
class where we can create a host for the web application.Setup Host in ASP.NET Core 2.x
The following is the
Program
class in ASP.NET Core 2.x:
Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
namespace MyFirstCoreApp
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
As you can see above, the
Main()
method calls method expression BuildWebHost()
to build web host with pre-configured defaults. The BuildWebHost
expression can also be written as a method that returns IWebHost
as shown below.public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Let's understand hosting steps.
The
WebHost
is a static class which can be used for creating an instance of IWebHost
and IWebHostBuilder
with pre-configured defaults. The CreateDefaultBuilder()
method creates a new instance of WebHostBuilder
with pre-configured defaults. Internally, it configures Kestrel, IISIntegration and other configurations. The following is CreateDefaultBuilder()
method.
CreateDefaultBuilder()
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
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, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.UseIISIntegration()
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
});
return builder;
}
As you can see above, the
CreateDefaultBuilder
method creates an instance of WebHostBuilder
and sets up Kestrel, content root directory, IIS integration.
Kestrel is an open-source, cross-platform web server for ASP.NET Core. It is designed to be used behind proxy because it has not yet matured to be exposed as a full-fledge web server.
It also calls
ConfigureAppConfiguration()
to load configurations from appsettings.json files, environment variables and user secrets. The ConfigureLogging()
method setup logging to console and debug window.
No comments