Spuštění aplikace v ASP.NET Core

Poznámka

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 7.

Důležité

Tyto informace se týkají předběžné verze produktu, který může být před komerčním vydáním podstatně změněn. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete v tomto článku ve verzi .NET 7.

Autor: Rick Anderson

Aplikace ASP.NET Core vytvořené pomocí webových šablon obsahují spouštěcí kód aplikace v souboru Program.cs.

Následující spouštěcí kód aplikace podporuje:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aplikace využívající EventSource můžou měřit čas spuštění, aby porozuměly výkonu při spuštění a optimalizovaly ho. Událost ServerReady v Microsoft.AspNetCore.Hosting představuje bod, ve kterém je server připraven reagovat na požadavky.

Další informace o spouštění aplikací najdete v přehledu ASP.NET Core základních informací.

Rozšíření spouštění pomocí spouštěcích filtrů

IStartupFilter použijte:

  • Konfigurace middlewaru na začátku nebo na konci kanálu middlewaru aplikace bez explicitního volání Use{Middleware}. Slouží IStartupFilter k přidání výchozích hodnot na začátek kanálu bez explicitní registrace výchozího middlewaru. IStartupFilter umožňuje za autora aplikace volat Use{Middleware} jinou komponentu.
  • Vytvoření kanálu Configure metod. IStartupFilter.Configure může nastavit middleware, který se má spustit před nebo po middlewaru přidaného knihovnami.

IStartupFilter implementuje Configure, který přijme a vrátí Action<IApplicationBuilder>. Definuje IApplicationBuilder třídu pro konfiguraci kanálu požadavků aplikace. Další informace najdete v tématu Vytvoření kanálu middlewaru pomocí nástroje IApplicationBuilder.

Každý z nich IStartupFilter může v kanálu požadavků přidat jeden nebo více middlewarů. Filtry jsou vyvolány v pořadí, v jakém byly přidány do kontejneru služby. Filtry můžou přidat middleware před nebo po předání ovládacího prvku do dalšího filtru, a proto se připojují na začátek nebo konec kanálu aplikace.

Následující příklad ukazuje, jak zaregistrovat middleware pomocí IStartupFilternástroje . Middleware RequestSetOptionsMiddleware nastaví hodnotu možností z parametru řetězce dotazu:

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);
    }
}

Je RequestSetOptionsMiddleware nakonfigurovaný ve RequestSetOptionsStartupFilter třídě:

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

Je IStartupFilter zaregistrovaný v Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Pokud je zadaný parametr řetězce dotazu prooption, middleware zpracuje přiřazení hodnoty předtím, než ASP.NET Core middleware vykreslí odpověď:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Pořadí spuštění middlewaru se nastavuje podle pořadí IStartupFilter registrací:

  • Více IStartupFilter implementací může interagovat se stejnými objekty. Pokud je řazení důležité, seřiděte registrace IStartupFilter služby tak, aby odpovídaly pořadí, ve které by měly middlewary běžet.

  • Knihovny můžou přidávat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného ve službě IStartupFilter. Vyvolání middlewaru IStartupFilter před middlewarem přidaným knihovnou IStartupFilter:

    • Umístěte registraci služby před přidání knihovny do kontejneru služby.
    • Pokud chcete vyvolat později, umístěte registraci služby po přidání knihovny.

Poznámka: Aplikaci ASP.NET Core nemůžete rozšířit, když přepíšete Configure. Další informace najdete v tomto problému na GitHubu.

Přidání konfigurace při spuštění z externího sestavení

Implementace IHostingStartup umožňuje přidat vylepšení aplikace při spuštění z externího sestavení mimo soubor aplikace Program.cs . Další informace viz Použití hostujících spouštěcích sestavení v ASP.NET Core.

Spuštění, Konfiguraceslužeb a Konfigurace

Informace o použití ConfigureServices metod a Configure s minimálním modelem hostování najdete tady:

Aplikace ASP.NET Core vytvořené pomocí webových šablon obsahují spouštěcí kód aplikace v souboru Program.cs.

Následující spouštěcí kód aplikace podporuje:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Další informace o spouštění aplikací najdete v přehledu ASP.NET Core základních informací.

Rozšíření spouštění pomocí spouštěcích filtrů

IStartupFilter použijte:

  • Konfigurace middlewaru na začátku nebo na konci kanálu middlewaru aplikace bez explicitního volání Use{Middleware}. Slouží IStartupFilter k přidání výchozích hodnot na začátek kanálu bez explicitní registrace výchozího middlewaru. IStartupFilter umožňuje za autora aplikace volat Use{Middleware} jinou komponentu.
  • Vytvoření kanálu Configure metod. IStartupFilter.Configure může nastavit middleware, který se má spustit před nebo po middlewaru přidaného knihovnami.

IStartupFilter implementuje Configure, který přijme a vrátí Action<IApplicationBuilder>. Definuje IApplicationBuilder třídu pro konfiguraci kanálu požadavků aplikace. Další informace najdete v tématu Vytvoření kanálu middlewaru pomocí nástroje IApplicationBuilder.

Každý z nich IStartupFilter může v kanálu požadavků přidat jeden nebo více middlewarů. Filtry jsou vyvolány v pořadí, v jakém byly přidány do kontejneru služby. Filtry můžou přidat middleware před nebo po předání ovládacího prvku do dalšího filtru, a proto se připojují na začátek nebo konec kanálu aplikace.

Následující příklad ukazuje, jak zaregistrovat middleware pomocí IStartupFilternástroje . Middleware RequestSetOptionsMiddleware nastaví hodnotu možností z parametru řetězce dotazu:

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);
    }
}

Je RequestSetOptionsMiddleware nakonfigurovaný ve RequestSetOptionsStartupFilter třídě:

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

Je IStartupFilter zaregistrovaný v Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Pokud je zadaný parametr řetězce dotazu prooption, middleware zpracuje přiřazení hodnoty předtím, než ASP.NET Core middleware vykreslí odpověď:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Pořadí spuštění middlewaru se nastavuje podle pořadí IStartupFilter registrací:

  • Více IStartupFilter implementací může interagovat se stejnými objekty. Pokud je řazení důležité, seřiděte registrace IStartupFilter služby tak, aby odpovídaly pořadí, ve které by měly middlewary běžet.

  • Knihovny můžou přidávat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného ve službě IStartupFilter. Vyvolání middlewaru IStartupFilter před middlewarem přidaným knihovnou IStartupFilter:

    • Umístěte registraci služby před přidání knihovny do kontejneru služby.
    • Pokud chcete vyvolat později, umístěte registraci služby po přidání knihovny.

Poznámka: Aplikaci ASP.NET Core nemůžete rozšířit, když přepíšete Configure. Další informace najdete u tohoto problému na GitHubu.

Přidání konfigurace při spuštění z externího sestavení

Implementace IHostingStartup umožňuje přidat vylepšení aplikace při spuštění z externího sestavení mimo soubor aplikace Program.cs . Další informace viz Použití hostujících spouštěcích sestavení v ASP.NET Core.

Třída Startup konfiguruje služby a kanál žádosti aplikace.

Spouštěcí třída

ASP.NET Core aplikace používají Startup třídu, která se nazývá Startup konvencí. Třída Startup:

  • Volitelně zahrnuje metodu ConfigureServices konfigurace služeb aplikace. Služba je opakovaně použitelná komponenta, která poskytuje funkce aplikace. Služby jsou zaregistrované v ConfigureServices aplikaci a využívají se v rámci aplikace prostřednictvím injektáže závislostí (DI) nebo ApplicationServices.
  • Zahrnuje metodu Configure pro vytvoření kanálu zpracování požadavků aplikace.

ConfigureServicesa Configure jsou volána modulem runtime ASP.NET Core při spuštění aplikace:

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();
        });
    }
}

Předchozí ukázka je pro Razor Pages; verze MVC je podobná.

Třída Startup se zadává při sestavení hostitele aplikace. Třída Startup je obvykle určena voláním WebHostBuilderExtensions.UseStartup/<TStartup> metody v tvůrci hostitele:

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>();
            });
}

Hostitel poskytuje služby, které jsou k dispozici konstruktoru Startup třídy. Aplikace přidává další služby prostřednictvím ConfigureServices. Hostitel i aplikační služby jsou dostupné v Configure aplikaci i v celé aplikaci.

Při použití obecného hostitele () lze do konstruktoru Startup vložit pouze následující typy služeb: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
        {
        }
    }
}

Většina služeb není k dispozici, dokud není volána Configure metoda .

Vícenásobné spuštění

Když aplikace definuje samostatné Startup třídy pro různá prostředí (například StartupDevelopment), vybere se za běhu příslušná Startup třída. Třída, jejíž přípona názvu odpovídá aktuálnímu prostředí, má prioritu. Pokud se aplikace spouští ve vývojovém prostředí a zahrnuje třídu i StartupStartupDevelopment třídu, StartupDevelopment použije se třída . Další informace najdete v tématu Použití více prostředí.

Další informace o hostiteli najdete v tématu Hostitel. Informace o zpracování chyb při spouštění najdete v tématu Zpracování výjimek při spuštění.

Metoda ConfigureServices

Metoda ConfigureServices je:

  • Nepovinný parametr.
  • Zavolá hostitel před metodou Configure ke konfiguraci služeb aplikace.
  • Kde jsou možnosti konfigurace nastaveny konvencí.

Hostitel může nakonfigurovat některé služby před Startup zavolání metod. Další informace najdete v tématu Hostitel.

Pro funkce, které vyžadují podstatné nastavení, jsou Add{Service} v systému k IServiceCollectiondispozici rozšiřující metody. Můžete například přidatDbContext, PřidatvýchozíIdentity, PřidatEntityFrameworkStores a PřidatRazorstránky:

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();
    }

Přidáním služeb do kontejneru služby je zpřístupníte v rámci aplikace a v Configure metodě . Služby se řeší prostřednictvím injektáže závislostí nebo z .ApplicationServices

Metoda Configure

Metoda Configure se používá k určení, jak bude aplikace reagovat na požadavky HTTP. Kanál požadavku se konfiguruje přidáním komponent middlewaruIApplicationBuilder do instance. IApplicationBuilder je k dispozici pro metodu Configure , ale není zaregistrovaná v kontejneru služby. Hostování vytvoří objekt IApplicationBuilder a předá ho přímo do Configure.

Šablony ASP.NET Core konfiguruje kanál s podporou:

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();
        });
    }
}

Předchozí ukázka je pro Razor Pages; verze MVC je podobná.

Každá Use rozšiřující metoda přidá do kanálu požadavku jednu nebo více komponent middlewaru. Například nakonfiguruje middleware pro UseStaticFiles obsluhu statických souborů.

Každá komponenta middlewaru v kanálu požadavků je zodpovědná za vyvolání další komponenty v kanálu nebo za zkratování řetězce, pokud je to vhodné.

V podpisu metody je možné zadat další služby, jako IWebHostEnvironmentjsou , ILoggerFactorynebo cokoli jiného definovaného Configure v ConfigureServices. Tyto služby se vloží, pokud jsou k dispozici.

Další informace o tom, jak používat IApplicationBuilder a pořadí zpracování middlewaru, najdete v tématu ASP.NET Core middlewaru.

Konfigurace služeb bez spuštění

Pokud chcete konfigurovat služby a kanál zpracování požadavků bez použití Startup třídy, volejte ConfigureServices metody a Configure metody usnadnění v tvůrci hostitelů. Více volání pro ConfigureServices připojení k sobě. Pokud existuje více Configure volání metody, použije se poslední Configure volání.

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"];
                });
            });
        });
}

Rozšíření spouštění o filtry po spuštění

IStartupFilter použijte:

  • Konfigurace middlewaru na začátku nebo na konci kanálu middlewaru aplikace bez explicitního volání Use{Middleware}metody IStartupFilterpoužívá ASP.NET Core k přidání výchozích hodnot na začátek kanálu, aniž by autor aplikace musel explicitně zaregistrovat výchozí middleware. IStartupFilter umožňuje volání Use{Middleware} jiné komponenty jménem autora aplikace.
  • Vytvoření kanálu Configure metod. IStartupFilter.Configure může nastavit middleware, který se má spouštět před nebo po middlewaru přidaném knihovnami.

IStartupFilter implementuje Configure, který přijímá a vrací Action<IApplicationBuilder>. Definuje IApplicationBuilder třídu pro konfiguraci kanálu požadavků aplikace. Další informace najdete v tématu Vytvoření kanálu middlewaru pomocí IApplicationBuilder.

Každý z nich IStartupFilter může do kanálu žádosti přidat jeden nebo více middlewarů. Filtry se volají v pořadí, v jakém byly přidány do kontejneru služby. Filtry můžou přidat middleware před nebo po předání řízení dalšímu filtru, a proto se připojují na začátek nebo konec kanálu aplikace.

Následující příklad ukazuje, jak zaregistrovat middleware pomocí IStartupFilter. Middleware RequestSetOptionsMiddleware nastaví hodnotu možností z parametru řetězce dotazu:

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);
    }
}

Je RequestSetOptionsMiddleware nakonfigurovaný ve RequestSetOptionsStartupFilter třídě :

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

Je zaregistrovaný IStartupFilter v kontejneru služby v 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>();
        });
}

Pokud je zadaný parametr řetězce dotazu prooption, middleware zpracuje přiřazení hodnoty před tím, než middleware ASP.NET Core vykreslí odpověď.

Pořadí provádění middlewaru se nastavuje podle pořadí IStartupFilter registrací:

  • Více IStartupFilter implementací může interagovat se stejnými objekty. Pokud je řazení důležité, seřadit IStartupFilter registrace služeb tak, aby odpovídaly pořadí, ve které se mají spouštět jejich middlewary.

  • Knihovny můžou přidávat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného ve službě IStartupFilter. Pokud chcete vyvolat IStartupFilter middleware před middlewarem přidaným knihovnou IStartupFilter:

    • Umístěte registraci služby před tím, než se knihovna přidá do kontejneru služby.
    • Pokud chcete vyvolat později, umístěte registraci služby po přidání knihovny.

Přidání konfigurace při spuštění z externího sestavení

Implementace IHostingStartup umožňuje přidávat vylepšení aplikace při spuštění z externího sestavení mimo třídu Startup aplikace. Další informace viz Použití hostujících spouštěcích sestavení v ASP.NET Core.

Další materiály