9.9 KiB
title | author | description | manager | ms.author | ms.custom | ms.date | ms.prod | ms.technology | ms.topic | uid |
---|---|---|---|---|---|---|---|---|---|---|
Application startup in ASP.NET Core | ardalis | Discover how the Startup class in ASP.NET Core configures services and the app's request pipeline. | wpickett | tdykstra | mvc | 12/08/2017 | asp.net-core | aspnet | article | fundamentals/startup |
Application startup in ASP.NET Core
By Steve Smith, Tom Dykstra, and Luke Latham
The Startup
class configures services and the app's request pipeline.
The Startup class
ASP.NET Core apps use a Startup
class, which is named Startup
by convention. The Startup
class:
- Can optionally include a ConfigureServices method to configure the app's services.
- Must include a Configure method to create the app's request processing pipeline.
ConfigureServices
and Configure
are called by the runtime when the app starts:
[!code-csharpMain]
Specify the Startup
class with the WebHostBuilderExtensions UseStartup<TStartup> method:
[!code-csharpMain]
The Startup
class constructor accepts dependencies defined by the host. A common use of dependency injection into the Startup
class is to inject:
- IHostingEnvironment to configure services by environment.
- IConfiguration to configure the app during startup.
[!code-csharpMain]
An alternative to injecting IHostingEnvironment
is to use a conventions-based approach. The app can define separate Startup
classes for different environments (for example, StartupDevelopment
), and the appropriate startup class is selected at runtime. The class whose name suffix matches the current environment is prioritized. If the app is run in the Development environment and includes both a Startup
class and a StartupDevelopment
class, the StartupDevelopment
class is used. For more information, see Working with multiple environments.
To learn more about WebHostBuilder
, see the Hosting topic. For information on handling errors during startup, see Startup exception handling.
The ConfigureServices method
The ConfigureServices method is:
- Optional.
- Called by the web host before the
Configure
method to configure the app's services. - Where configuration options are set by convention.
Adding services to the service container makes them available within the app and in the Configure
method. The services are resolved via dependency injection or from IApplicationBuilder.ApplicationServices.
The web host may configure some services before Startup
methods are called. Details are available in the Hosting topic.
For features that require substantial setup, there are Add[Service]
extension methods on IServiceCollection. A typical web app registers services for Entity Framework, Identity, and MVC:
[!code-csharpMain]
Services available in Startup
The web host provides some services that are available to the Startup
class constructor. The app adds additional services via ConfigureServices
. Both the host and app services are then available in Configure
and throughout the application.
The Configure method
The Configure method is used to specify how the app responds to HTTP requests. The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder
is available to the Configure
method, but it isn't registered in the service container. Hosting creates an IApplicationBuilder
and passes it directly to Configure
(reference source).
The ASP.NET Core templates configure the pipeline with support for a developer exception page, BrowserLink, error pages, static files, and ASP.NET MVC:
[!code-csharpMain]
Each Use
extension method adds a middleware component to the request pipeline. For instance, the UseMvc
extension method adds the routing middleware to the request pipeline and configures MVC as the default handler.
Additional services, such as IHostingEnvironment
and ILoggerFactory
, may also be specified in the method signature. When specified, additional services are injected if they're available.
For more information on how to use IApplicationBuilder
, see Middleware.
Convenience methods
ConfigureServices and Configure convenience methods can be used instead of specifying a Startup
class. Multiple calls to ConfigureServices
append to one another. Multiple calls to Configure
use the last method call.
[!code-csharpMain]
Startup filters
Use IStartupFilter to configure middleware at the beginning or end of an app's Configure middleware pipeline. IStartupFilter
is useful to ensure that a middleware runs before or after middleware added by libraries at the start or end of the app's request processing pipeline.
IStartupFilter
implements a single method, Configure, which receives and returns an Action<IApplicationBuilder>
. An IApplicationBuilder defines a class to configure an app's request pipeline. For more information, see Creating a middleware pipeline with IApplicationBuilder.
Each IStartupFilter
implements one or more middlewares in the request pipeline. The filters are invoked in the order they were added to the service container. Filters may add middleware before or after passing control to the next filter, thus they append to the beginning or end of the app pipeline.
The sample app (how to download) demonstrates how to register a middleware with IStartupFilter
. The sample app includes a middleware that sets an options value from a query string parameter:
[!code-csharpMain]
The RequestSetOptionsMiddleware
is configured in the RequestSetOptionsStartupFilter
class:
[!code-csharpMain]
The IStartupFilter
is registered in the service container in ConfigureServices
:
[!code-csharpMain]
When a query string parameter for option
is provided, the middleware processes the value assignment before the MVC middleware renders the response:
Middleware execution order is set by the order of IStartupFilter
registrations:
- Multiple
IStartupFilter
implementations may interact with the same objects. If ordering is important, order theirIStartupFilter
service registrations to match the order that their middlewares should run. - Libraries may add middleware with one or more
IStartupFilter
implementations that run before or after other app middleware registered withIStartupFilter
. To invoke anIStartupFilter
middleware before a middleware added by a library'sIStartupFilter
, position the service registration before the library is added to the service container. To invoke it afterward, position the service registration after the library is added.