Démarrage d’une application dans ASP.NET CoreApp startup in ASP.NET Core

Par Rick Anderson, Tom Dykstra, Luke Latham et Steve SmithBy Rick Anderson, Tom Dykstra, Luke Latham, and Steve Smith

La classe Startup configure des services et le pipeline de requête de l’application.The Startup class configures services and the app's request pipeline.

Classe StartupThe Startup class

Les applications ASP.NET Core utilisent une classe Startup, appelée Startup par convention.ASP.NET Core apps use a Startup class, which is named Startup by convention. Classe Startup :The Startup class:

  • Inclut éventuellement une méthode ConfigureServices pour configurer les services de l’application.Optionally includes a ConfigureServices method to configure the app's services. Un service est un composant réutilisable qui fournit une fonctionnalité d’application.A service is a reusable component that provides app functionality. Les services sont inscrits dans ConfigureServices et utilisés dans toute l’application via l' injection de dépendances (DI) ou ApplicationServices.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Inclut une méthode Configure pour créer le pipeline de traitement des requêtes de l’application.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices et Configure sont appelés par le runtime ASP.NET Core au lancement de l’application :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();
        });
    }
}

L’exemple précédent concerne Razor Pages, toutefois, la version MVC est similaire.The preceding sample is for Razor Pages; the MVC version is similar.

La classe Startup est spécifiée quand l’hôte de l’application est créé.The Startup class is specified when the app's host is built. La classe Startup est généralement spécifiée en appelant la méthode WebHostBuilderExtensions. UseStartup<TStartup > sur le générateur d’ordinateur hôte :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>();
            });
}

L’hôte fournit des services accessibles au constructeur de classe Startup.The host provides services that are available to the Startup class constructor. L’application ajoute des services supplémentaires à l’aide de ConfigureServices.The app adds additional services via ConfigureServices. Les services de l’hôte ainsi que ceux de l’application sont disponibles dans Configure et dans l’ensemble de l’application.Both the host and app services are available in Configure and throughout the app.

Seuls les types de service suivants peuvent être injectés dans le constructeur Startup lors de l’utilisation de l' hôte générique (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
        {
        }
    }
}

La plupart des services ne sont pas disponibles tant que la méthode Configure n’est pas appelée.Most services are not available until the Configure method is called.

Démarrage multipleMultiple Startup

Quand l’application définit différentes classes Startup pour différents environnements (par exemple, StartupDevelopment), la classe Startup appropriée est sélectionnée au moment de l’exécution.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. La classe dont le suffixe du nom correspond à l'environnement actuel est prioritaire.The class whose name suffix matches the current environment is prioritized. Si l’application est exécutée dans l’environnement de développement et qu’elle inclut à la fois une classe Startup et une classe StartupDevelopment, la classe StartupDevelopment est utilisée.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Pour plus d’informations, consultez Utiliser plusieurs environnements.For more information, see Use multiple environments.

Pour plus d’informations sur l’hôte, consultez L’hôte.See The host for more information on the host. Pour plus d’informations sur la gestion des erreurs lors du démarrage, consultez Gestion des exceptions de démarrage.For information on handling errors during startup, see Startup exception handling.

Méthode ConfigureServicesThe ConfigureServices method

La méthode ConfigureServices est :The ConfigureServices method is:

  • Option facultative.Optional.
  • Appelée par l’hôte avant la méthode Configure pour configurer les services de l’applicationCalled by the host before the Configure method to configure the app's services.
  • L’emplacement où les options de configuration sont définies par convention.Where configuration options are set by convention.

L’hôte peut configurer certains services avant l’appel des méthodes Startup.The host may configure some services before Startup methods are called. Pour plus d’informations, consultez L’hôte.For more information, see The host.

Pour les fonctionnalités qui nécessitent une configuration importante, il existe des méthodes d’extension Add{Service} pour IServiceCollection.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Par exemple,AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores et 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();
    }

L’ajout de services au conteneur de service les rend disponibles dans l’application et dans la méthode Configure.Adding services to the service container makes them available within the app and in the Configure method. Les services sont résolus via l’injection de dépendances ou à partir de ApplicationServices.The services are resolved via dependency injection or from ApplicationServices.

Méthode ConfigureThe Configure method

La méthode Configure permet de spécifier le mode de réponse de l’application aux requêtes HTTP.The Configure method is used to specify how the app responds to HTTP requests. Vous configurez le pipeline de requête en ajoutant des composants d’intergiciel (middleware) à une instance de IApplicationBuilder.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder est disponible pour la méthode Configure, mais elle n’est pas inscrite dans le conteneur de service.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. L’hébergement crée un IApplicationBuilder et le passe directement à Configure.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Les modèles ASP.NET Core configurent le pipeline pour permettre la prise en charge des éléments suivants :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();
        });
    }
}

L’exemple précédent concerne Razor Pages, toutefois, la version MVC est similaire.The preceding sample is for Razor Pages; the MVC version is similar.

Chaque méthode d’extension Use ajoute un ou plusieurs composants de middleware au pipeline de requête.Each Use extension method adds one or more middleware components to the request pipeline. Par exemple, UseStaticFiles configure le middleware pour qu’il traite des fichiers statiques.For instance, UseStaticFiles configures middleware to serve static files.

Chaque composant de middleware du pipeline des requêtes est chargé d’appeler le composant suivant du pipeline ou de court-circuiter la chaîne, si c’est approprié.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

Vous pouvez spécifier des services supplémentaires (comme IWebHostEnvironment, ILoggerFactory et tout service défini dans ConfigureServices) dans la signature de la méthode Configure.Additional services, such as IWebHostEnvironment, ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Ces services sont injectés s’ils sont disponibles.These services are injected if they're available.

Pour plus d’informations sur l’utilisation de IApplicationBuilder et sur l’ordre de traitement des middlewares, consultez Intergiciel (middleware) ASP.NET Core.For more information on how to use IApplicationBuilder and the order of middleware processing, see Intergiciel (middleware) ASP.NET Core.

Configurer des services sans démarrageConfigure services without Startup

Pour configurer les services et le pipeline de traitement de requête sans utiliser de classe Startup, appelez les méthodes pratiques ConfigureServices et Configure sur le générateur de l’hôte.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Les appels multiples à ConfigureServices s’ajoutent les uns aux autres.Multiple calls to ConfigureServices append to one another. S’il existe plusieurs appels de méthode Configure, le dernier appel de Configure est utilisé.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"];
                });
            });
        });
}

Étendre le démarrage avec les filtres de démarrageExtend Startup with startup filters

Utilisez IStartupFilter:Use IStartupFilter:

  • Pour configurer l’intergiciel (middleware) au début ou à la fin du pipeline de configuration d’une application sans appel explicite à 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 est utilisé par ASP.NET Core pour ajouter des valeurs par défaut au début du pipeline sans avoir à faire de l’auteur de l’application un enregistrement explicite de l’intergiciel (middleware) par défaut.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 autorise un appel de composant différent Use{Middleware} pour le compte de l’auteur de l’application.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Pour créer un pipeline de méthodes Configure.To create a pipeline of Configure methods. IStartupFilter.Configure peut définir un middleware à exécuter avant ou après les middlewares qui sont ajoutés par les bibliothèques.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implémente Configure, qui reçoit et retourne un Action<IApplicationBuilder>.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. IApplicationBuilder définit une classe pour configurer le pipeline de requête d’une application.An IApplicationBuilder defines a class to configure an app's request pipeline. Pour plus d’informations, consultez Créer un pipeline de middlewares avec IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Chaque IStartupFilter peut ajouter un ou plusieurs middlewares au pipeline de requête.Each IStartupFilter can add one or more middlewares in the request pipeline. Les filtres sont appelés dans l’ordre dans lequel ils ont été ajoutés au conteneur de service.The filters are invoked in the order they were added to the service container. Les filtres peuvent ajouter l’intergiciel avant ou après la transmission du contrôle au filtre suivant. Par conséquent, ils s’ajoutent au début ou à la fin du pipeline de l’application.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.

L’exemple suivant montre comment inscrire un middleware auprès de IStartupFilter.The following example demonstrates how to register a middleware with IStartupFilter. Le middleware RequestSetOptionsMiddleware définit une valeur d’options à partir d’un paramètre de chaîne de requête :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);
    }
}

RequestSetOptionsMiddleware est configuré dans la 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);
        };
    }
}

IStartupFilter est inscrit dans le conteneur de service de 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>();
        });
}

Quand un paramètre de chaîne de requête pour option est fourni, le middleware traite l’affectation de valeur avant que le middleware ASP.NET Core n’affiche la réponse.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

L’ordre d’exécution de l’intergiciel est défini par l’ordre des inscriptions d’IStartupFilter :Middleware execution order is set by the order of IStartupFilter registrations:

  • Plusieurs implémentations d’IStartupFilter peuvent interagir avec les mêmes objets.Multiple IStartupFilter implementations may interact with the same objects. Si l’ordre est important, définissez l’ordre des inscriptions de leurs services IStartupFilter pour qu’il corresponde à l’ordre dans lequel leurs intergiciels doivent s’exécuter.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Les bibliothèques peuvent ajouter des intergiciels avec une ou plusieurs implémentations IStartupFilter qui s’exécutent avant ou après l’autre intergiciel d’application inscrit avec IStartupFilter.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. Pour appeler un middleware IStartupFilter avant un middleware ajouté par le IStartupFilter d’une bibliothèque :To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Placez l’inscription du service avant l’ajout de la bibliothèque au conteneur de service.Position the service registration before the library is added to the service container.
    • Pour les appels suivants, placez l’inscription du service après l’ajout de la bibliothèque.To invoke afterward, position the service registration after the library is added.

Ajouter la configuration au démarrage à partir d’un assembly externeAdd configuration at startup from an external assembly

Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup de l’application.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Pour plus d'informations, consultez Utiliser des assemblys de démarrage d’hébergement dans ASP.NET Core.For more information, see Utiliser des assemblys de démarrage d’hébergement dans ASP.NET Core.

Ressources supplémentairesAdditional resources

Classe StartupThe Startup class

Les applications ASP.NET Core utilisent une classe Startup, appelée Startup par convention.ASP.NET Core apps use a Startup class, which is named Startup by convention. Classe Startup :The Startup class:

  • Inclut éventuellement une méthode ConfigureServices pour configurer les services de l’application.Optionally includes a ConfigureServices method to configure the app's services. Un service est un composant réutilisable qui fournit une fonctionnalité d’application.A service is a reusable component that provides app functionality. Les services sont inscrits dans ConfigureServices et utilisés dans toute l’application via l' injection de dépendances (DI) ou ApplicationServices.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Inclut une méthode Configure pour créer le pipeline de traitement des requêtes de l’application.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices et Configure sont appelés par le runtime ASP.NET Core au lancement de l’application :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)
    {
        ...
    }
}

La classe Startup est spécifiée quand l’hôte de l’application est créé.The Startup class is specified when the app's host is built. La classe Startup est généralement spécifiée en appelant la méthode WebHostBuilderExtensions. UseStartup<TStartup > sur le générateur d’ordinateur hôte :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>();
}

L’hôte fournit des services accessibles au constructeur de classe Startup.The host provides services that are available to the Startup class constructor. L’application ajoute des services supplémentaires à l’aide de ConfigureServices.The app adds additional services via ConfigureServices. Les services de l’hôte ainsi que ceux de l’application sont alors disponibles dans Configure et dans l’ensemble de l’application.Both the host and app services are then available in Configure and throughout the app.

Une utilisation courante de l’injection de dépendances dans la classe Startup consiste à injecter :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"]
    }
}

La plupart des services ne sont pas disponibles tant que la méthode Configure n’est pas appelée.Most services are not available until the Configure method is called.

Démarrage multipleMultiple Startup

Quand l’application définit différentes classes Startup pour différents environnements (par exemple, StartupDevelopment), la classe Startup appropriée est sélectionnée au moment de l’exécution.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. La classe dont le suffixe du nom correspond à l'environnement actuel est prioritaire.The class whose name suffix matches the current environment is prioritized. Si l’application est exécutée dans l’environnement de développement et qu’elle inclut à la fois une classe Startup et une classe StartupDevelopment, la classe StartupDevelopment est utilisée.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Pour plus d’informations, consultez Utiliser plusieurs environnements.For more information, see Use multiple environments.

Pour plus d’informations sur l’hôte, consultez L’hôte.See The host for more information on the host. Pour plus d’informations sur la gestion des erreurs lors du démarrage, consultez Gestion des exceptions de démarrage.For information on handling errors during startup, see Startup exception handling.

Méthode ConfigureServicesThe ConfigureServices method

La méthode ConfigureServices est :The ConfigureServices method is:

  • Option facultative.Optional.
  • Appelée par l’hôte avant la méthode Configure pour configurer les services de l’applicationCalled by the host before the Configure method to configure the app's services.
  • L’emplacement où les options de configuration sont définies par convention.Where configuration options are set by convention.

L’hôte peut configurer certains services avant l’appel des méthodes Startup.The host may configure some services before Startup methods are called. Pour plus d’informations, consultez L’hôte.For more information, see The host.

Pour les fonctionnalités qui nécessitent une configuration importante, il existe des méthodes d’extension Add{Service} pour IServiceCollection.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Par exemple,AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores et 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>();
}

L’ajout de services au conteneur de service les rend disponibles dans l’application et dans la méthode Configure.Adding services to the service container makes them available within the app and in the Configure method. Les services sont résolus via l’injection de dépendances ou à partir de ApplicationServices.The services are resolved via dependency injection or from ApplicationServices.

Pour plus d’informations sur SetCompatibilityVersion, voir SetCompatibilityVersion.See SetCompatibilityVersion for more information on SetCompatibilityVersion.

Méthode ConfigureThe Configure method

La méthode Configure permet de spécifier le mode de réponse de l’application aux requêtes HTTP.The Configure method is used to specify how the app responds to HTTP requests. Vous configurez le pipeline de requête en ajoutant des composants d’intergiciel (middleware) à une instance de IApplicationBuilder.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder est disponible pour la méthode Configure, mais elle n’est pas inscrite dans le conteneur de service.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. L’hébergement crée un IApplicationBuilder et le passe directement à Configure.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Les modèles ASP.NET Core configurent le pipeline pour permettre la prise en charge des éléments suivants :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();
}

Chaque méthode d’extension Use ajoute un ou plusieurs composants de middleware au pipeline de requête.Each Use extension method adds one or more middleware components to the request pipeline. Par exemple, UseStaticFiles configure le middleware pour qu’il traite des fichiers statiques.For instance, UseStaticFiles configures middleware to serve static files.

Chaque composant de middleware du pipeline des requêtes est chargé d’appeler le composant suivant du pipeline ou de court-circuiter la chaîne, si c’est approprié.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

Vous pouvez spécifier des services supplémentaires (comme IHostingEnvironment, ILoggerFactory et tout service défini dans ConfigureServices) dans la signature de la méthode Configure.Additional services, such as IHostingEnvironment and ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Ces services sont injectés s’ils sont disponibles.These services are injected if they're available.

Pour plus d’informations sur l’utilisation de IApplicationBuilder et sur l’ordre de traitement des middlewares, consultez Intergiciel (middleware) ASP.NET Core.For more information on how to use IApplicationBuilder and the order of middleware processing, see Intergiciel (middleware) ASP.NET Core.

Configurer des services sans démarrageConfigure services without Startup

Pour configurer les services et le pipeline de traitement de requête sans utiliser de classe Startup, appelez les méthodes pratiques ConfigureServices et Configure sur le générateur de l’hôte.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Les appels multiples à ConfigureServices s’ajoutent les uns aux autres.Multiple calls to ConfigureServices append to one another. S’il existe plusieurs appels de méthode Configure, le dernier appel de Configure est utilisé.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"];

                ...
            });
}

Étendre le démarrage avec les filtres de démarrageExtend Startup with startup filters

Utilisez IStartupFilter:Use IStartupFilter:

  • Pour configurer l’intergiciel (middleware) au début ou à la fin du pipeline de configuration d’une application sans appel explicite à 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 est utilisé par ASP.NET Core pour ajouter des valeurs par défaut au début du pipeline sans avoir à faire de l’auteur de l’application un enregistrement explicite de l’intergiciel (middleware) par défaut.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 autorise un appel de composant différent Use{Middleware} pour le compte de l’auteur de l’application.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Pour créer un pipeline de méthodes Configure.To create a pipeline of Configure methods. IStartupFilter.Configure peut définir un middleware à exécuter avant ou après les middlewares qui sont ajoutés par les bibliothèques.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implémente Configure, qui reçoit et retourne un Action<IApplicationBuilder>.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. IApplicationBuilder définit une classe pour configurer le pipeline de requête d’une application.An IApplicationBuilder defines a class to configure an app's request pipeline. Pour plus d’informations, consultez Créer un pipeline de middlewares avec IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Chaque IStartupFilter peut ajouter un ou plusieurs middlewares au pipeline de requête.Each IStartupFilter can add one or more middlewares in the request pipeline. Les filtres sont appelés dans l’ordre dans lequel ils ont été ajoutés au conteneur de service.The filters are invoked in the order they were added to the service container. Les filtres peuvent ajouter l’intergiciel avant ou après la transmission du contrôle au filtre suivant. Par conséquent, ils s’ajoutent au début ou à la fin du pipeline de l’application.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.

L’exemple suivant montre comment inscrire un middleware auprès de IStartupFilter.The following example demonstrates how to register a middleware with IStartupFilter. Le middleware RequestSetOptionsMiddleware définit une valeur d’options à partir d’un paramètre de chaîne de requête :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);
    }
}

RequestSetOptionsMiddleware est configuré dans la 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);
        };
    }
}

IStartupFilter est inscrit dans le conteneur de service de ConfigureServices.The IStartupFilter is registered in the service container in ConfigureServices.

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

Quand un paramètre de chaîne de requête pour option est fourni, le middleware traite l’affectation de valeur avant que le middleware ASP.NET Core n’affiche la réponse.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

L’ordre d’exécution de l’intergiciel est défini par l’ordre des inscriptions d’IStartupFilter :Middleware execution order is set by the order of IStartupFilter registrations:

  • Plusieurs implémentations d’IStartupFilter peuvent interagir avec les mêmes objets.Multiple IStartupFilter implementations may interact with the same objects. Si l’ordre est important, définissez l’ordre des inscriptions de leurs services IStartupFilter pour qu’il corresponde à l’ordre dans lequel leurs intergiciels doivent s’exécuter.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Les bibliothèques peuvent ajouter des intergiciels avec une ou plusieurs implémentations IStartupFilter qui s’exécutent avant ou après l’autre intergiciel d’application inscrit avec IStartupFilter.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. Pour appeler un middleware IStartupFilter avant un middleware ajouté par le IStartupFilter d’une bibliothèque :To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Placez l’inscription du service avant l’ajout de la bibliothèque au conteneur de service.Position the service registration before the library is added to the service container.
    • Pour les appels suivants, placez l’inscription du service après l’ajout de la bibliothèque.To invoke afterward, position the service registration after the library is added.

Ajouter la configuration au démarrage à partir d’un assembly externeAdd configuration at startup from an external assembly

Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup de l’application.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Pour plus d'informations, consultez Utiliser des assemblys de démarrage d’hébergement dans ASP.NET Core.For more information, see Utiliser des assemblys de démarrage d’hébergement dans ASP.NET Core.

Ressources supplémentairesAdditional resources