Create an empty ASP.NET Core project that doesn’t include default features i.e. an empty shell.
First create a new empty project using Visual Studio 2017
- File > New > Project
- Under “.NET Core”, select “ASP.NET Core Web Application”. Enter Name and Location. Click OK.
- Select “Empty”. Click OK.
Next remove the code from
Startup.cs so that they look like below (keeping the necessary using statements):
public class Program
public static void Main(string args)
public static IWebHost BuildWebHost(string args) =>
public class Startup
public void ConfigureServices(
// setup dependency injection in service container
public void Configure(
// setup request pipeline using middleware
Empty project template in Visual Studio 2017 creates a project with
Just like a Console application,
public static void Main() is the starting point for ASP.NET Core applications.
We’re setting up a host (
WebHost) that references the server handling requests (Kestrel). This is achieved using
CreateDefaultBuilder() method that configures:
- Kestrel: cross-platform web server
- Root: content root will use the web project’s root folder
- IIS: as the reverse proxy server
- Startup: points to a class that sets up configuration, services and pipeline. See next section.
- Configuration: adds
appsettings.jsonand Environment Variables to
IConfiguration, which is available via Dependency Injection. See next section
- Logging: adds a Console and Debug logging providers.
Once configured, we
Run() the host, at which point the main thread is blocked and host starts listening to request from the server.
When setting up
WebHostBuilder, you could set values for various settings via
UseSetting() method, which takes in a key/value pair for a property. These properties include applicationName (string), contentRoot (string), detailedErrors (bool), environment (string), urls (semicolon separated list) and webroot (string). Some of these properties can also be set via extension methods on
This class sets up the application dependency injection services and request pipeline for our application, using following methods:
ConfigureServices(): add services to the service container
Configure(): setup request pipeline using Middleware.
The parameters for these methods can be seen in the code listing above.
These methods are called in the same sequence as listed above. The important point to remember about the sequence in which they run is that the service container is available after
ConfigureServices, i.e. in
Configure() method, and not before that.