Anwendungsstart in ASP.NET CoreApp startup in ASP.NET Core

Von Rick Anderson, Tom Dykstra und Steve SmithBy Rick Anderson, Tom Dykstra, and Steve Smith

Die Startup-Klasse konfiguriert Dienste und die Anforderungspipeline einer App.The Startup class configures services and the app's request pipeline.

Die Startup-KlasseThe Startup class

ASP.NET Core-Apps verwenden eine Startup-Klasse, die standardmäßig Startup genannt wird.ASP.NET Core apps use a Startup class, which is named Startup by convention. Die Startup-Klasse:The Startup class:

  • Kann eine ConfigureServices-Methode enthalten, um die Dienste der App zu konfigurieren.Optionally includes a ConfigureServices method to configure the app's services. Ein Dienst ist eine wiederverwendbare Komponente, die App-Funktionalität bereitstellt.A service is a reusable component that provides app functionality. Dienste werden in ConfigureServicesregistriert und in der App über Dependency Injection (DI) oder ApplicationServices genutzt.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Enthält eine Configure-Methode, um die Anforderungsverarbeitungspipeline einer App zu erstellen.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices und Configure werden von der ASP.NET Core-Runtime aufgerufen, wenn die App gestartet wird: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();
        });
    }
}

Das Beispiel oben bezieht sich auf [Razor Pages. Die MVC-Version ist aber ähnlich.The preceding sample is for [Razor Pages; the MVC version is similar.

Die Startup-Klasse wird angegeben, wenn der Host der App erstellt wird.The Startup class is specified when the app's host is built. Die Startup-Klasse wird in der Regel durch Aufruf der WebHostBuilderExtensions.UseStartup<TStartup>-Methode im Hostgenerator angegeben: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>();
            });
}

Der Host stellt Dienste für den Startup-Klassenkonstruktor bereit.The host provides services that are available to the Startup class constructor. Die App fügt über ConfigureServices zusätzliche Dienste hinzu.The app adds additional services via ConfigureServices. Sowohl die Host- als auch die App-Dienste sind in Configure und über die App verfügbar.Both the host and app services are available in Configure and throughout the app.

Bei Verwendung des generischen Hosts (IHostBuilder) können nur die folgenden Diensttypen in den Startup-Konstruktor eingefügt werden: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
        {
        }
    }
}

Die meisten Dienste sind erst verfügbar, wenn die Configure-Methode aufgerufen wird.Most services are not available until the Configure method is called.

Mehrere Startup-KlassenMultiple Startup

Wenn die App unterschiedliche Startup-Klassen für unterschiedliche Umgebungen definiert (z.B. StartupDevelopment), wird zur Laufzeit die entsprechende Startup-Klasse ausgewählt.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. Die Klasse, deren Namenssuffix mit der aktuellen Umgebung übereinstimmt, wird priorisiert.The class whose name suffix matches the current environment is prioritized. Wenn die App in der Entwicklungsumgebung ausgeführt wird und sowohl eine Startup-Klasse als auch eine StartupDevelopment-Klasse enthält, wird die StartupDevelopment-Klasse verwendet.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Weitere Informationen finden Sie unter Verwenden mehrerer Umgebungen.For more information, see Use multiple environments.

Weitere Informationen zum Host finden Sie unter Der Host.See The host for more information on the host. Weitere Informationen zum Umgang mit Fehlern beim Start finden Sie unter Startup exception handling (Umgang mit Ausnahmen beim Start).For information on handling errors during startup, see Startup exception handling.

Die ConfigureServices-MethodeThe ConfigureServices method

Die ConfigureServices-Methode:The ConfigureServices method is:

  • Dies ist optional.Optional.
  • wird vor der Configure-Methode vom Host aufgerufen, um die App-Dienste zu konfigurieren.Called by the host before the Configure method to configure the app's services.
  • Über diese Methode werden standardmäßig Konfigurationsoptionen festgelegt.Where configuration options are set by convention.

Es kann sein, dass der Host einige Dienste konfiguriert, bevor die Startup-Methoden aufgerufen werden.The host may configure some services before Startup methods are called. Weitere Informationen finden Sie unter Der Host.For more information, see The host.

Für Features, die ein umfangreiches Setup erfordern, sind in IServiceCollectionAdd{Service}-Erweiterungsmethoden verfügbar.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Beispiel: AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores und 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();
    }

Wenn Sie Dienste zum Dienstcontainer hinzufügen, können Sie auch über die App und die Configure-Methode auf diese zugreifen.Adding services to the service container makes them available within the app and in the Configure method. Die Dienste werden über die Dependency Injection oder über ApplicationServices aufgelöst.The services are resolved via dependency injection or from ApplicationServices.

Die Configure-MethodeThe Configure method

Die Configure-Methode wird verwendet, um festzulegen, wie die App auf HTTP-Anforderungen reagiert.The Configure method is used to specify how the app responds to HTTP requests. Sie können die Anforderungspipeline konfigurieren, indem Sie Middlewarekomponenten zu einer IApplicationBuilder-Instanz hinzufügen.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. Die Configure-Methode kann auf IApplicationBuilder zugreifen, wird aber nicht im Dienstcontainer registriert.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. Über das Hosting wird ein IApplicationBuilder erstellt, der direkt an Configure übergeben wird.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Die ASP.NET Core-Vorlagen konfigurieren die Pipeline mit Unterstützung für: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();
        });
    }
}

Das Beispiel oben bezieht sich auf [Razor Pages. Die MVC-Version ist aber ähnlich.The preceding sample is for [Razor Pages; the MVC version is similar.

Jede Use-Erweiterungsmethode fügt mindestens eine Middlewarekomponente zu der Anforderungspipeline hinzu.Each Use extension method adds one or more middleware components to the request pipeline. Beispielsweise konfiguriert UseStaticFilesMiddleware für die Bereitstellung statischer Dateien.For instance, UseStaticFiles configures middleware to serve static files.

Jede Middlewarekomponente in der Anforderungspipeline ist für das Aufrufen der jeweils nächsten Komponente in der Pipeline oder, wenn nötig, für das Kurzschließen der Kette zuständig.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

In der Configure-Methodensignatur können außerdem auch zusätzliche Dienste wie IWebHostEnvironment, ILoggerFactory oder in ConfigureServices definierte Dienste angegeben werden.Additional services, such as IWebHostEnvironment, ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Diese Dienste werden eingefügt, wenn Sie verfügbar sind.These services are injected if they're available.

Weitere Informationen zur Verwendung von IApplicationBuilder und der Reihenfolge der Middlewareverarbeitung finden Sie unter ASP.NET Core-Middleware.For more information on how to use IApplicationBuilder and the order of middleware processing, see ASP.NET Core-Middleware.

Konfigurieren von Diensten ohne StartConfigure services without Startup

Rufen Sie die Hilfsmethoden ConfigureServices und Configure im Hostgenerator auf, um Dienste und die Anforderungsverarbeitungspipeline ohne die Startup-Klasse zu konfigurieren.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Wenn ConfigureServices mehrmals aufgerufen wird, werden diese Aufrufe einander angefügt.Multiple calls to ConfigureServices append to one another. Wenn es mehrere Aufrufe der Methode Configure gibt, wird der letzte Configure-Aufruf verwendet.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"];
                });
            });
        });
}

Erweitern Sie den Start mit StartfilternExtend Startup with startup filters

Verwenden Sie IStartupFilter:Use IStartupFilter:

  • Um Middleware am Anfang und Ende der Configure-Middlewarepipeline einer App zu konfigurieren, ohne Use{Middleware} explizit aufzurufen.To configure middleware at the beginning or end of an app's Configure middleware pipeline without an explicit call to Use{Middleware}. IStartupFilter wird von ASP.NET Core verwendet, um Standardwerte am Anfang der Pipeline hinzuzufügen, ohne dass der App-Autor die Standardmiddleware explizit registrieren lassen muss.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 ermöglicht im Auftrag des App-Autors einen Aufruf einer anderen Komponente Use{Middleware}.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Um eine Pipeline aus Configure-Methoden zu erstellen.To create a pipeline of Configure methods. IStartupFilter.Configure kann festlegen, dass eine Middleware vor oder nach dem Hinzufügen von Middleware durch Bibliotheken ausgeführt wird.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implementiert Configure. Das Element empfängt einen Action<IApplicationBuilder> und gibt diesen zurück.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. Eine IApplicationBuilder-Schnittstelle definiert Klassen, um die Anforderungspipeline einer App zu konfigurieren.An IApplicationBuilder defines a class to configure an app's request pipeline. Weitere Informationen finden Sie unter Erstellen einer Middlewarepipeline mit IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Jeder IStartupFilter kann mindestens eine Middlewarekomponente in der Anforderungspipeline hinzufügen.Each IStartupFilter can add one or more middlewares in the request pipeline. Die Filter werden in der Reihenfolge aufgerufen, in der sie zum Dienstcontainer hinzugefügt wurden.The filters are invoked in the order they were added to the service container. Über Filter kann Middleware hinzugefügt werden, bevor oder nachdem dem nächsten Filter die Kontrolle erteilt wird. D.h., sie wird am Anfang oder am Ende einer App-Pipeline hinzugefügt.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.

Im folgenden Beispiel wird veranschaulicht, wie Middleware bei IStartupFilter registriert wird.The following example demonstrates how to register a middleware with IStartupFilter. Die RequestSetOptionsMiddleware-Middleware legt einen Optionswert über einen Parameter der Abfragezeichenfolge fest: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);
    }
}

Die RequestSetOptionsMiddleware-Klasse wird in der RequestSetOptionsStartupFilter-Klasse konfiguriert: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);
        };
    }
}

Der IStartupFilter wird im Dienstcontainer in ConfigureServices registriert.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>();
        });
}

Wenn für option ein Parameter der Abfragezeichenfolge bereitgestellt wird, verarbeitet die Middleware die Wertzuweisung, bevor die ASP.NET Core-Middleware die Antwort rendert.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

Die Reihenfolge der Ausführung der Middleware ist von der Reihenfolge der IStartupFilter-Registrierungen abhängig:Middleware execution order is set by the order of IStartupFilter registrations:

  • Es kann sein, dass mehrere Implementierungen von IStartupFilter mit denselben Objekten interagieren.Multiple IStartupFilter implementations may interact with the same objects. Wenn die Reihenfolge für Sie wichtig ist, sollten Sie die IStartupFilter-Dienstregistrierungen der Implementierungen in der Reihenfolge anordnen, in der die Middleware ausgeführt werden soll.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Bibliotheken fügen möglicherweise Middleware mit mindestens einer IStartupFilter-Implementierung hinzu, die vor oder nach anderer App-Middleware ausgeführt wird, die über IStartupFilter registriert wurde.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. So rufen Sie IStartupFilter-Middleware auf, bevor eine Middleware durch den IStartupFilter von einer Bibliothek hinzugefügt wird:To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Positionieren Sie die Dienstregistrierung, bevor die Bibliothek dem Dienstcontainer hinzugefügt wird.Position the service registration before the library is added to the service container.
    • Wenn sie danach aufgerufen werden soll, positionieren Sie die Dienstregistrierung, nachdem die Bibliothek hinzugefügt wurde.To invoke afterward, position the service registration after the library is added.

Hinzufügen von Konfigurationen aus einer externen Assembly beim StartAdd configuration at startup from an external assembly

Eine IHostingStartup-Implementierung ermöglicht das Hinzufügen von Erweiterungen zu einer App beim Start von einer externen Assembly außerhalb der Startup-Klasse der App aus.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Weitere Informationen finden Sie unter Verwenden von Hostingstartassemblys in ASP.NET Core.For more information, see Verwenden von Hostingstartassemblys in ASP.NET Core.

Zusätzliche RessourcenAdditional resources

Die Startup-KlasseThe Startup class

ASP.NET Core-Apps verwenden eine Startup-Klasse, die standardmäßig Startup genannt wird.ASP.NET Core apps use a Startup class, which is named Startup by convention. Die Startup-Klasse:The Startup class:

  • Kann eine ConfigureServices-Methode enthalten, um die Dienste der App zu konfigurieren.Optionally includes a ConfigureServices method to configure the app's services. Ein Dienst ist eine wiederverwendbare Komponente, die App-Funktionalität bereitstellt.A service is a reusable component that provides app functionality. Dienste werden in ConfigureServicesregistriert und in der App über Dependency Injection (DI) oder ApplicationServices genutzt.Services are registered in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • Enthält eine Configure-Methode, um die Anforderungsverarbeitungspipeline einer App zu erstellen.Includes a Configure method to create the app's request processing pipeline.

ConfigureServices und Configure werden von der ASP.NET Core-Runtime aufgerufen, wenn die App gestartet wird: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)
    {
        ...
    }
}

Die Startup-Klasse wird angegeben, wenn der Host der App erstellt wird.The Startup class is specified when the app's host is built. Die Startup-Klasse wird in der Regel durch Aufruf der WebHostBuilderExtensions.UseStartup<TStartup>-Methode im Hostgenerator angegeben: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>();
}

Der Host stellt Dienste für den Startup-Klassenkonstruktor bereit.The host provides services that are available to the Startup class constructor. Die App fügt über ConfigureServices zusätzliche Dienste hinzu.The app adds additional services via ConfigureServices. Daher sind sowohl die Host- als auch die App-Dienste in Configure und über die App verfügbar.Both the host and app services are then available in Configure and throughout the app.

Dependency Injection wird häufig im Zusammenhang mit der Startup-Klasse verwendet, um Folgendes einzufügen: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"]
    }
}

Die meisten Dienste sind erst verfügbar, wenn die Configure-Methode aufgerufen wird.Most services are not available until the Configure method is called.

Mehrere Startup-KlassenMultiple Startup

Wenn die App unterschiedliche Startup-Klassen für unterschiedliche Umgebungen definiert (z.B. StartupDevelopment), wird zur Laufzeit die entsprechende Startup-Klasse ausgewählt.When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. Die Klasse, deren Namenssuffix mit der aktuellen Umgebung übereinstimmt, wird priorisiert.The class whose name suffix matches the current environment is prioritized. Wenn die App in der Entwicklungsumgebung ausgeführt wird und sowohl eine Startup-Klasse als auch eine StartupDevelopment-Klasse enthält, wird die StartupDevelopment-Klasse verwendet.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. Weitere Informationen finden Sie unter Verwenden mehrerer Umgebungen.For more information, see Use multiple environments.

Weitere Informationen zum Host finden Sie unter Der Host.See The host for more information on the host. Weitere Informationen zum Umgang mit Fehlern beim Start finden Sie unter Startup exception handling (Umgang mit Ausnahmen beim Start).For information on handling errors during startup, see Startup exception handling.

Die ConfigureServices-MethodeThe ConfigureServices method

Die ConfigureServices-Methode:The ConfigureServices method is:

  • Dies ist optional.Optional.
  • wird vor der Configure-Methode vom Host aufgerufen, um die App-Dienste zu konfigurieren.Called by the host before the Configure method to configure the app's services.
  • Über diese Methode werden standardmäßig Konfigurationsoptionen festgelegt.Where configuration options are set by convention.

Es kann sein, dass der Host einige Dienste konfiguriert, bevor die Startup-Methoden aufgerufen werden.The host may configure some services before Startup methods are called. Weitere Informationen finden Sie unter Der Host.For more information, see The host.

Für Features, die ein umfangreiches Setup erfordern, sind in IServiceCollectionAdd{Service}-Erweiterungsmethoden verfügbar.For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. Beispiel: AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores und 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>();
}

Wenn Sie Dienste zum Dienstcontainer hinzufügen, können Sie auch über die App und die Configure-Methode auf diese zugreifen.Adding services to the service container makes them available within the app and in the Configure method. Die Dienste werden über die Dependency Injection oder über ApplicationServices aufgelöst.The services are resolved via dependency injection or from ApplicationServices.

Unter SetCompatibilityVersion finden Sie weitere Informationen zu SetCompatibilityVersion.See SetCompatibilityVersion for more information on SetCompatibilityVersion.

Die Configure-MethodeThe Configure method

Die Configure-Methode wird verwendet, um festzulegen, wie die App auf HTTP-Anforderungen reagiert.The Configure method is used to specify how the app responds to HTTP requests. Sie können die Anforderungspipeline konfigurieren, indem Sie Middlewarekomponenten zu einer IApplicationBuilder-Instanz hinzufügen.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. Die Configure-Methode kann auf IApplicationBuilder zugreifen, wird aber nicht im Dienstcontainer registriert.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. Über das Hosting wird ein IApplicationBuilder erstellt, der direkt an Configure übergeben wird.Hosting creates an IApplicationBuilder and passes it directly to Configure.

Die ASP.NET Core-Vorlagen konfigurieren die Pipeline mit Unterstützung für: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();
}

Jede Use-Erweiterungsmethode fügt mindestens eine Middlewarekomponente zu der Anforderungspipeline hinzu.Each Use extension method adds one or more middleware components to the request pipeline. Beispielsweise konfiguriert UseStaticFilesMiddleware für die Bereitstellung statischer Dateien.For instance, UseStaticFiles configures middleware to serve static files.

Jede Middlewarekomponente in der Anforderungspipeline ist für das Aufrufen der jeweils nächsten Komponente in der Pipeline oder, wenn nötig, für das Kurzschließen der Kette zuständig.Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate.

In der Configure-Methodensignatur können außerdem auch zusätzliche Dienste wie IHostingEnvironment und ILoggerFactory oder in ConfigureServices definierte Dienste angegeben werden.Additional services, such as IHostingEnvironment and ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. Diese Dienste werden eingefügt, wenn Sie verfügbar sind.These services are injected if they're available.

Weitere Informationen zur Verwendung von IApplicationBuilder und der Reihenfolge der Middlewareverarbeitung finden Sie unter ASP.NET Core-Middleware.For more information on how to use IApplicationBuilder and the order of middleware processing, see ASP.NET Core-Middleware.

Konfigurieren von Diensten ohne StartConfigure services without Startup

Rufen Sie die Hilfsmethoden ConfigureServices und Configure im Hostgenerator auf, um Dienste und die Anforderungsverarbeitungspipeline ohne die Startup-Klasse zu konfigurieren.To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. Wenn ConfigureServices mehrmals aufgerufen wird, werden diese Aufrufe einander angefügt.Multiple calls to ConfigureServices append to one another. Wenn es mehrere Aufrufe der Methode Configure gibt, wird der letzte Configure-Aufruf verwendet.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"];

                ...
            });
}

Erweitern Sie den Start mit StartfilternExtend Startup with startup filters

Verwenden Sie IStartupFilter:Use IStartupFilter:

  • Um Middleware am Anfang und Ende der Configure-Middlewarepipeline einer App zu konfigurieren, ohne Use{Middleware} explizit aufzurufen.To configure middleware at the beginning or end of an app's Configure middleware pipeline without an explicit call to Use{Middleware}. IStartupFilter wird von ASP.NET Core verwendet, um Standardwerte am Anfang der Pipeline hinzuzufügen, ohne dass der App-Autor die Standardmiddleware explizit registrieren lassen muss.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 ermöglicht im Auftrag des App-Autors einen Aufruf einer anderen Komponente Use{Middleware}.IStartupFilter allows a different component call Use{Middleware} on behalf of the app author.
  • Um eine Pipeline aus Configure-Methoden zu erstellen.To create a pipeline of Configure methods. IStartupFilter.Configure kann festlegen, dass eine Middleware vor oder nach dem Hinzufügen von Middleware durch Bibliotheken ausgeführt wird.IStartupFilter.Configure can set a middleware to run before or after middleware added by libraries.

IStartupFilter implementiert Configure. Das Element empfängt einen Action<IApplicationBuilder> und gibt diesen zurück.IStartupFilter implements Configure, which receives and returns an Action<IApplicationBuilder>. Eine IApplicationBuilder-Schnittstelle definiert Klassen, um die Anforderungspipeline einer App zu konfigurieren.An IApplicationBuilder defines a class to configure an app's request pipeline. Weitere Informationen finden Sie unter Erstellen einer Middlewarepipeline mit IApplicationBuilder.For more information, see Create a middleware pipeline with IApplicationBuilder.

Jeder IStartupFilter kann mindestens eine Middlewarekomponente in der Anforderungspipeline hinzufügen.Each IStartupFilter can add one or more middlewares in the request pipeline. Die Filter werden in der Reihenfolge aufgerufen, in der sie zum Dienstcontainer hinzugefügt wurden.The filters are invoked in the order they were added to the service container. Über Filter kann Middleware hinzugefügt werden, bevor oder nachdem dem nächsten Filter die Kontrolle erteilt wird. D.h., sie wird am Anfang oder am Ende einer App-Pipeline hinzugefügt.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.

Im folgenden Beispiel wird veranschaulicht, wie Middleware bei IStartupFilter registriert wird.The following example demonstrates how to register a middleware with IStartupFilter. Die RequestSetOptionsMiddleware-Middleware legt einen Optionswert über einen Parameter der Abfragezeichenfolge fest: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);
    }
}

Die RequestSetOptionsMiddleware-Klasse wird in der RequestSetOptionsStartupFilter-Klasse konfiguriert: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);
        };
    }
}

Der IStartupFilter wird im Dienstcontainer in ConfigureServices registriert.The IStartupFilter is registered in the service container in ConfigureServices.

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

Wenn für option ein Parameter der Abfragezeichenfolge bereitgestellt wird, verarbeitet die Middleware die Wertzuweisung, bevor die ASP.NET Core-Middleware die Antwort rendert.When a query string parameter for option is provided, the middleware processes the value assignment before the ASP.NET Core middleware renders the response.

Die Reihenfolge der Ausführung der Middleware ist von der Reihenfolge der IStartupFilter-Registrierungen abhängig:Middleware execution order is set by the order of IStartupFilter registrations:

  • Es kann sein, dass mehrere Implementierungen von IStartupFilter mit denselben Objekten interagieren.Multiple IStartupFilter implementations may interact with the same objects. Wenn die Reihenfolge für Sie wichtig ist, sollten Sie die IStartupFilter-Dienstregistrierungen der Implementierungen in der Reihenfolge anordnen, in der die Middleware ausgeführt werden soll.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.

  • Bibliotheken fügen möglicherweise Middleware mit mindestens einer IStartupFilter-Implementierung hinzu, die vor oder nach anderer App-Middleware ausgeführt wird, die über IStartupFilter registriert wurde.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. So rufen Sie IStartupFilter-Middleware auf, bevor eine Middleware durch den IStartupFilter von einer Bibliothek hinzugefügt wird:To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter:

    • Positionieren Sie die Dienstregistrierung, bevor die Bibliothek dem Dienstcontainer hinzugefügt wird.Position the service registration before the library is added to the service container.
    • Wenn sie danach aufgerufen werden soll, positionieren Sie die Dienstregistrierung, nachdem die Bibliothek hinzugefügt wurde.To invoke afterward, position the service registration after the library is added.

Hinzufügen von Konfigurationen aus einer externen Assembly beim StartAdd configuration at startup from an external assembly

Eine IHostingStartup-Implementierung ermöglicht das Hinzufügen von Erweiterungen zu einer App beim Start von einer externen Assembly außerhalb der Startup-Klasse der App aus.An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. Weitere Informationen finden Sie unter Verwenden von Hostingstartassemblys in ASP.NET Core.For more information, see Verwenden von Hostingstartassemblys in ASP.NET Core.

Zusätzliche RessourcenAdditional resources