Inicialização de aplicativo no ASP.NET CoreApp startup in ASP.NET Core

Por Rick Anderson, Tom Dykstra, Luke Latham e Steve SmithBy Rick Anderson, Tom Dykstra, Luke Latham, and Steve Smith

A classe Startup configura serviços e o pipeline de solicitação do aplicativo.The Startup class configures services and the app's request pipeline.

A classe StartupThe Startup class

Os aplicativos do ASP.NET Core usam uma classe Startup, que é chamada de Startup por convenção.ASP.NET Core apps use a Startup class, which is named Startup by convention. A classe Startup:The Startup class:

  • Opcionalmente, inclua um método ConfigureServices para configurar os serviços do aplicativo.Optionally includes a ConfigureServices method to configure the app's services. Um serviço é um componente reutilizável que fornece a funcionalidade do aplicativo.A service is a reusable component that provides app functionality. Os serviços são registrados em ConfigureServices e consumidos em todo o aplicativo por meio de injeção de dependência (DI) ou ApplicationServices.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Inclui um método Configure para criar o pipeline de processamento de solicitações do aplicativo.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices e Configure são chamados pelo runtime do ASP.NET Core quando o aplicativo é iniciado:ConfigureServices and Configure are called by the ASP.NET Core runtime when the app starts:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

O exemplo anterior é para Razor Pages; a versão MVC é semelhante.The preceding sample is for Razor Pages; the MVC version is similar.

A classe Startup é especificada quando o host do aplicativo é criado.The Startup class is specified when the app's host is built. A classe Startup normalmente é especificada chamando o método WebHostBuilderExtensions. UseStartup<TStartup > no host Builder:The Startup class is typically specified by calling the WebHostBuilderExtensions.UseStartup<TStartup> method on the host builder:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

O host fornece serviços que estão disponíveis para o construtor de classe Startup.The host provides services that are available to the Startup class constructor. O aplicativo adiciona serviços adicionais por meio de ConfigureServices.The app adds additional services via ConfigureServices. Os serviços de aplicativos e o host ficam disponíveis em Configure e em todo o aplicativo.Both the host and app services are available in Configure and throughout the app.

Somente os seguintes tipos de serviço podem ser injetados no construtor de Startup ao usar o host genérico (IHostBuilder):Only the following service types can be injected into the Startup constructor when using the Generic Host (IHostBuilder):

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        }
        else
        {
        }
    }
}

A maioria dos serviços não está disponível até o método Configure ser chamado.Most services are not available until the Configure method is called.

Inicialização múltiplaMultiple Startup

Quando o aplicativo define classes Startup separadas para ambientes diferentes (por exemplo, StartupDevelopment), a classe Startup apropriada é selecionada no runtime.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. A classe cujo sufixo do nome corresponde ao ambiente atual é priorizada.The class whose name suffix matches the current environment is prioritized. Se o aplicativo for executado no ambiente de desenvolvimento e incluir uma classe Startup e uma classe StartupDevelopment, a classe StartupDevelopment será usada.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Para obter mais informações, veja Usar vários ambientes.For more information, see Use multiple environments.

Veja O host para obter mais informações sobre o host.See The host for more information on the host. Para obter informações sobre como tratar erros durante a inicialização, consulte Tratamento de exceção na inicialização.For information on handling errors during startup, see Startup exception handling.

O método ConfigureServicesThe ConfigureServices method

O método ConfigureServices é:The ConfigureServices method is:

  • Opcional.Optional.
  • Chamado pelo host antes do método Configure para configurar os serviços do aplicativo.Called by the host before the Configure method to configure the app's services.
  • Quando as opções de configuração são definidas por convenção.Where configuration options are set by convention.

O host pode configurar alguns serviços antes que métodos Startup sejam chamados.The host may configure some services before Startup methods are called. Para obter mais informações, confira O host.For more information, see The host.

Para recursos que exigem uma configuração significativa, há métodos de extensão Add{Service} em IServiceCollection.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Por exemplo, AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores e AddRazorPages:For example, AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores, and AddRazorPages:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();
    }

Adicionar serviços ao contêiner de serviços os torna disponíveis dentro do aplicativo e no método Configure.Adding services to the service container makes them available within the app and in the Configure method. Os serviços são resolvidos por meio da injeção de dependência ou de ApplicationServices.The services are resolved via dependency injection or from ApplicationServices.

O método ConfigureThe Configure method

O método Configure é usado para especificar como o aplicativo responde às solicitações HTTP.The Configure method is used to specify how the app responds to HTTP requests. O pipeline de solicitação é configurado adicionando componentes de middleware a uma instância de IApplicationBuilder.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder está disponível para o método Configure, mas não é registrado no contêiner de serviço.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. A hospedagem cria um IApplicationBuilder e o passa diretamente para Configure.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Os modelos do ASP.NET Core configuram o pipeline com suporte para:The ASP.NET Core templates configure the pipeline with support for:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

O exemplo anterior é para Razor Pages; a versão MVC é semelhante.The preceding sample is for Razor Pages; the MVC version is similar.

Cada método de extensão Use adiciona um ou mais componentes de middleware ao pipeline de solicitação.Each Use extension method adds one or more middleware components to the request pipeline. Por exemplo, UseStaticFiles configura o middleware para atender arquivos estáticos.For instance, UseStaticFiles configures middleware to serve static files.

Cada componente de middleware no pipeline de solicitação é responsável por invocar o próximo componente no pipeline ou causar um curto-circuito da cadeia, se apropriado.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

Serviços adicionais, como IWebHostEnvironment, ILoggerFactory ou qualquer coisa definida em ConfigureServices, podem ser especificados na assinatura do método Configure.Additional services, such as IWebHostEnvironment, ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Esses serviços serão injetados se estiverem disponíveis.These services are injected if they're available.

Para obter mais informações de como usar o IApplicationBuilder e a ordem de processamento de middleware, confira Middleware do ASP.NET Core.For more information on how to use IApplicationBuilder and the order of middleware processing, see Middleware do ASP.NET Core.

Configurar serviços sem InicializaçãoConfigure services without Startup

Para configurar serviços e o pipeline de processamento de solicitação sem usar uma classe Startup, chame os métodos de conveniência ConfigureServices e Configure no construtor do host.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Diversas chamadas para ConfigureServices são acrescentadas umas às outras.Multiple calls to ConfigureServices append to one another. Se houver várias chamadas de método Configure, a última chamada de Configure será usada.If multiple Configure method calls exist, the last Configure call is used.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

Estender a inicialização com filtros de inicializaçãoExtend Startup with startup filters

Usar IStartupFilter:Use IStartupFilter:

  • Para configurar o middleware no início ou no final de um pipeline de middleware de configuração de um aplicativo sem uma chamada explícita para Use{Middleware}.To configure middleware at the beginning or end of an app's Configure middleware pipeline without an explicit call to Use{Middleware}. IStartupFilter é usado por ASP.NET Core para adicionar padrões ao início do pipeline sem precisar fazer com que o autor do aplicativo registre explicitamente o middleware padrão.IStartupFilter is used by ASP.NET Core to add defaults to the beginning of the pipeline without having to make the app author explicitly register the default middleware. IStartupFilter permite que uma chamada de componente diferente Use{Middleware} em nome do autor do aplicativo.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Para criar um pipeline de métodos de Configure.To create a pipeline of Configure methods. IStartupFilter.Configure pode definir um middleware para ser executado antes ou depois do middleware adicionado pelas bibliotecas.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implementa Configure, que recebe e retorna um Action<IApplicationBuilder>.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. Um IApplicationBuilder define uma classe para configurar o pipeline de solicitação do aplicativo.An IApplicationBuilder defines a class to configure an app's request pipeline. Para obter mais informações, confira Criar um pipeline de middleware com o IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Cada IStartupFilter pode adicionar um ou mais middlewares no pipeline de solicitação.Each IStartupFilter can add one or more middlewares in the request pipeline. Os filtros são invocados na ordem em que foram adicionados ao contêiner de serviço.The filters are invoked in the order they were added to the service container. Filtros podem adicionar middleware antes ou depois de passar o controle para o filtro seguinte, de modo que eles são acrescentados ao início ou no final do pipeline de aplicativo.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.

O exemplo a seguir demonstra como registrar um middleware com IStartupFilter.The following example demonstrates how to register a middleware with IStartupFilter. O middleware RequestSetOptionsMiddleware define um valor de opção de um parâmetro de cadeia de caracteres de consulta:The RequestSetOptionsMiddleware middleware sets an options value from a query string parameter:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware( RequestDelegate next )
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

O RequestSetOptionsMiddleware é configurado na classe RequestSetOptionsStartupFilter:The RequestSetOptionsMiddleware is configured in the RequestSetOptionsStartupFilter class:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

O IStartupFilter é registrado no contêiner de serviço em ConfigureServices.The IStartupFilter is registered in the service container in ConfigureServices.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((hostingContext, config) =>
           {
           })
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder.UseStartup<Startup>();
         })
        .ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();
        });
}

Quando um parâmetro de cadeia de caracteres de consulta para option é fornecido, o middleware processa a atribuição de valor antes que o middleware do ASP.NET Core renderize a resposta.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

A ordem de execução do middleware é definida pela ordem dos registros IStartupFilter:Middleware execution order is set by the order of IStartupFilter registrations:

  • Várias implementações de IStartupFilter podem interagir com os mesmos objetos.Multiple IStartupFilter implementations may interact with the same objects. Se a ordem for importante, ordene seus registros de serviço IStartupFilter para corresponder à ordem em que os middlewares devem ser executados.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Bibliotecas podem adicionar middleware com uma ou mais implementações de IStartupFilter que são executadas antes ou depois de outro middleware de aplicativo registrado com IStartupFilter.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. Para invocar um middleware IStartupFilter antes de um middleware adicionado pelo IStartupFilter de uma biblioteca:To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Posicione o registro do serviço antes que a biblioteca seja adicionada ao contêiner de serviço.Position the service registration before the library is added to the service container.
    • Para invocá-lo posteriormente, posicione o registro do serviço após a biblioteca ser adicionada.To invoke afterward, position the service registration after the library is added.

Adicionar configuração na inicialização usando um assembly externoAdd configuration at startup from an external assembly

Uma implementação IHostingStartup permite adicionar melhorias a um aplicativo durante a inicialização de um assembly externo fora da classe Startup do aplicativo.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Para obter mais informações, consulte Usar assemblies de inicialização de hospedagem no ASP.NET Core.For more information, see Usar assemblies de inicialização de hospedagem no ASP.NET Core.

Recursos adicionaisAdditional resources

A classe StartupThe Startup class

Os aplicativos do ASP.NET Core usam uma classe Startup, que é chamada de Startup por convenção.ASP.NET Core apps use a Startup class, which is named Startup by convention. A classe Startup:The Startup class:

  • Opcionalmente, inclua um método ConfigureServices para configurar os serviços do aplicativo.Optionally includes a ConfigureServices method to configure the app's services. Um serviço é um componente reutilizável que fornece a funcionalidade do aplicativo.A service is a reusable component that provides app functionality. Os serviços são registrados em ConfigureServices e consumidos em todo o aplicativo por meio de injeção de dependência (DI) ou ApplicationServices.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Inclui um método Configure para criar o pipeline de processamento de solicitações do aplicativo.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices e Configure são chamados pelo runtime do ASP.NET Core quando o aplicativo é iniciado:ConfigureServices and Configure are called by the ASP.NET Core runtime when the app starts:

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

A classe Startup é especificada quando o host do aplicativo é criado.The Startup class is specified when the app's host is built. A classe Startup normalmente é especificada chamando o método WebHostBuilderExtensions. UseStartup<TStartup > no host Builder:The Startup class is typically specified by calling the WebHostBuilderExtensions.UseStartup<TStartup> method on the host builder:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

O host fornece serviços que estão disponíveis para o construtor de classe Startup.The host provides services that are available to the Startup class constructor. O aplicativo adiciona serviços adicionais por meio de ConfigureServices.The app adds additional services via ConfigureServices. Os serviços de aplicativos e o host ficam, então, disponíveis em Configure e em todo o aplicativo.Both the host and app services are then available in Configure and throughout the app.

Um uso comum da injeção de dependência na classe Startup é injetar:A common use of dependency injection into the Startup class is to inject:

public class Startup
{
    private readonly IHostingEnvironment _env;
    private readonly IConfiguration _config;
    private readonly ILoggerFactory _loggerFactory;

    public Startup(IHostingEnvironment env, IConfiguration config, 
        ILoggerFactory loggerFactory)
    {
        _env = env;
        _config = config;
        _loggerFactory = loggerFactory;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var logger = _loggerFactory.CreateLogger<Startup>();

        if (_env.IsDevelopment())
        {
            // Development service configuration

            logger.LogInformation("Development environment");
        }
        else
        {
            // Non-development service configuration

            logger.LogInformation("Environment: {EnvironmentName}", _env.EnvironmentName);
        }

        // Configuration is available during startup.
        // Examples:
        //   _config["key"]
        //   _config["subsection:suboption1"]
    }
}

A maioria dos serviços não está disponível até o método Configure ser chamado.Most services are not available until the Configure method is called.

Inicialização múltiplaMultiple Startup

Quando o aplicativo define classes Startup separadas para ambientes diferentes (por exemplo, StartupDevelopment), a classe Startup apropriada é selecionada no runtime.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. A classe cujo sufixo do nome corresponde ao ambiente atual é priorizada.The class whose name suffix matches the current environment is prioritized. Se o aplicativo for executado no ambiente de desenvolvimento e incluir uma classe Startup e uma classe StartupDevelopment, a classe StartupDevelopment será usada.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Para obter mais informações, veja Usar vários ambientes.For more information, see Use multiple environments.

Veja O host para obter mais informações sobre o host.See The host for more information on the host. Para obter informações sobre como tratar erros durante a inicialização, consulte Tratamento de exceção na inicialização.For information on handling errors during startup, see Startup exception handling.

O método ConfigureServicesThe ConfigureServices method

O método ConfigureServices é:The ConfigureServices method is:

  • Opcional.Optional.
  • Chamado pelo host antes do método Configure para configurar os serviços do aplicativo.Called by the host before the Configure method to configure the app's services.
  • Quando as opções de configuração são definidas por convenção.Where configuration options are set by convention.

O host pode configurar alguns serviços antes que métodos Startup sejam chamados.The host may configure some services before Startup methods are called. Para obter mais informações, confira O host.For more information, see The host.

Para recursos que exigem uma configuração significativa, há métodos de extensão Add{Service} em IServiceCollection.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Por exemplo, AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores e AddRazorPages:For example, AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores, and AddRazorPages:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

Adicionar serviços ao contêiner de serviços os torna disponíveis dentro do aplicativo e no método Configure.Adding services to the service container makes them available within the app and in the Configure method. Os serviços são resolvidos por meio da injeção de dependência ou de ApplicationServices.The services are resolved via dependency injection or from ApplicationServices.

Confira SetCompatibilityVersion para obter mais informações sobre SetCompatibilityVersion.See SetCompatibilityVersion for more information on SetCompatibilityVersion.

O método ConfigureThe Configure method

O método Configure é usado para especificar como o aplicativo responde às solicitações HTTP.The Configure method is used to specify how the app responds to HTTP requests. O pipeline de solicitação é configurado adicionando componentes de middleware a uma instância de IApplicationBuilder.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder está disponível para o método Configure, mas não é registrado no contêiner de serviço.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. A hospedagem cria um IApplicationBuilder e o passa diretamente para Configure.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Os modelos do ASP.NET Core configuram o pipeline com suporte para:The ASP.NET Core templates configure the pipeline with support for:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

Cada método de extensão Use adiciona um ou mais componentes de middleware ao pipeline de solicitação.Each Use extension method adds one or more middleware components to the request pipeline. Por exemplo, UseStaticFiles configura o middleware para atender arquivos estáticos.For instance, UseStaticFiles configures middleware to serve static files.

Cada componente de middleware no pipeline de solicitação é responsável por invocar o próximo componente no pipeline ou causar um curto-circuito da cadeia, se apropriado.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

Serviços adicionais, como IHostingEnvironment e ILoggerFactory ou qualquer coisa definida em ConfigureServices, podem ser especificados na assinatura do método Configure.Additional services, such as IHostingEnvironment and ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Esses serviços serão injetados se estiverem disponíveis.These services are injected if they're available.

Para obter mais informações de como usar o IApplicationBuilder e a ordem de processamento de middleware, confira Middleware do ASP.NET Core.For more information on how to use IApplicationBuilder and the order of middleware processing, see Middleware do ASP.NET Core.

Configurar serviços sem InicializaçãoConfigure services without Startup

Para configurar serviços e o pipeline de processamento de solicitação sem usar uma classe Startup, chame os métodos de conveniência ConfigureServices e Configure no construtor do host.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Diversas chamadas para ConfigureServices são acrescentadas umas às outras.Multiple calls to ConfigureServices append to one another. Se houver várias chamadas de método Configure, a última chamada de Configure será usada.If multiple Configure method calls exist, the last Configure call is used.

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

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureServices(services =>
            {
                ...
            })
            .Configure(app =>
            {
                var loggerFactory = app.ApplicationServices
                    .GetRequiredService<ILoggerFactory>();
                var logger = loggerFactory.CreateLogger<Program>();
                var env = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();
                var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                logger.LogInformation("Logged in Configure");

                if (env.IsDevelopment())
                {
                    ...
                }
                else
                {
                    ...
                }

                var configValue = config["subsection:suboption1"];

                ...
            });
}

Estender a inicialização com filtros de inicializaçãoExtend Startup with startup filters

Usar IStartupFilter:Use IStartupFilter:

  • Para configurar o middleware no início ou no final de um pipeline de middleware de configuração de um aplicativo sem uma chamada explícita para Use{Middleware}.To configure middleware at the beginning or end of an app's Configure middleware pipeline without an explicit call to Use{Middleware}. IStartupFilter é usado por ASP.NET Core para adicionar padrões ao início do pipeline sem precisar fazer com que o autor do aplicativo registre explicitamente o middleware padrão.IStartupFilter is used by ASP.NET Core to add defaults to the beginning of the pipeline without having to make the app author explicitly register the default middleware. IStartupFilter permite que uma chamada de componente diferente Use{Middleware} em nome do autor do aplicativo.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Para criar um pipeline de métodos de Configure.To create a pipeline of Configure methods. IStartupFilter.Configure pode definir um middleware para ser executado antes ou depois do middleware adicionado pelas bibliotecas.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implementa Configure, que recebe e retorna um Action<IApplicationBuilder>.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. Um IApplicationBuilder define uma classe para configurar o pipeline de solicitação do aplicativo.An IApplicationBuilder defines a class to configure an app's request pipeline. Para obter mais informações, confira Criar um pipeline de middleware com o IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Cada IStartupFilter pode adicionar um ou mais middlewares no pipeline de solicitação.Each IStartupFilter can add one or more middlewares in the request pipeline. Os filtros são invocados na ordem em que foram adicionados ao contêiner de serviço.The filters are invoked in the order they were added to the service container. Filtros podem adicionar middleware antes ou depois de passar o controle para o filtro seguinte, de modo que eles são acrescentados ao início ou no final do pipeline de aplicativo.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.

O exemplo a seguir demonstra como registrar um middleware com IStartupFilter.The following example demonstrates how to register a middleware with IStartupFilter. O middleware RequestSetOptionsMiddleware define um valor de opção de um parâmetro de cadeia de caracteres de consulta:The RequestSetOptionsMiddleware middleware sets an options value from a query string parameter:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;
    private IOptions<AppOptions> _injectedOptions;

    public RequestSetOptionsMiddleware(
        RequestDelegate next, IOptions<AppOptions> injectedOptions)
    {
        _next = next;
        _injectedOptions = injectedOptions;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Console.WriteLine("RequestSetOptionsMiddleware.Invoke");

        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            _injectedOptions.Value.Option = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

O RequestSetOptionsMiddleware é configurado na classe RequestSetOptionsStartupFilter:The RequestSetOptionsMiddleware is configured in the RequestSetOptionsStartupFilter class:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

O IStartupFilter é registrado no contêiner de serviço em ConfigureServices.The IStartupFilter is registered in the service container in ConfigureServices.

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddTransient<IStartupFilter, 
            RequestSetOptionsStartupFilter>();
    })
    .UseStartup<Startup>()
    .Build();

Quando um parâmetro de cadeia de caracteres de consulta para option é fornecido, o middleware processa a atribuição de valor antes que o middleware do ASP.NET Core renderize a resposta.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

A ordem de execução do middleware é definida pela ordem dos registros IStartupFilter:Middleware execution order is set by the order of IStartupFilter registrations:

  • Várias implementações de IStartupFilter podem interagir com os mesmos objetos.Multiple IStartupFilter implementations may interact with the same objects. Se a ordem for importante, ordene seus registros de serviço IStartupFilter para corresponder à ordem em que os middlewares devem ser executados.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Bibliotecas podem adicionar middleware com uma ou mais implementações de IStartupFilter que são executadas antes ou depois de outro middleware de aplicativo registrado com IStartupFilter.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. Para invocar um middleware IStartupFilter antes de um middleware adicionado pelo IStartupFilter de uma biblioteca:To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Posicione o registro do serviço antes que a biblioteca seja adicionada ao contêiner de serviço.Position the service registration before the library is added to the service container.
    • Para invocá-lo posteriormente, posicione o registro do serviço após a biblioteca ser adicionada.To invoke afterward, position the service registration after the library is added.

Adicionar configuração na inicialização usando um assembly externoAdd configuration at startup from an external assembly

Uma implementação IHostingStartup permite adicionar melhorias a um aplicativo durante a inicialização de um assembly externo fora da classe Startup do aplicativo.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Para obter mais informações, consulte Usar assemblies de inicialização de hospedagem no ASP.NET Core.For more information, see Usar assemblies de inicialização de hospedagem no ASP.NET Core.

Recursos adicionaisAdditional resources