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

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v této verzi ASP.NET Core 8.0.

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 spouštění a optimalizovaly ho. Událost ServerReady představuje bod, ve Microsoft.AspNetCore.Hosting kterém je server připravený reagovat na požadavky.

Další informace o spuštění aplikace najdete v tématu ASP.NET Základní přehled.

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

IStartupFilter použijte:

  • Konfigurace middlewaru na začátku nebo 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, aby jiná komponenta volala Use{Middleware} jménem autora aplikace.
  • Vytvoření kanálu Configure metod IStartupFilter.Configure může nastavit middleware, který se má spustit před nebo po přidání middlewaru knihovnami.

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

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

Následující příklad ukazuje, jak zaregistrovat middleware s 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);
    }
}

Konfiguruje se RequestSetOptionsMiddleware 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 registrován 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 option řetězce dotazu, middleware zpracuje přiřazení hodnoty před middlewarem ASP.NET Core 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í provádění middlewaru IStartupFilter je nastaveno pořadím registrací:

  • Několik IStartupFilter implementací může pracovat se stejnými objekty. Pokud je řazení důležité, objednejte si IStartupFilter registrace služeb tak, aby odpovídaly objednávce, kterou by měly spouštět jejich middlewary.

  • Knihovny mohou přidat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného v IStartupFilteraplikaci . 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 volat později, umístěte registraci služby po přidání knihovny.

Poznámka: Při přepsání Configurenení možné rozšířit aplikaci ASP.NET Core. 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řidání vylepšení do 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í, konfigurace služeb a konfigurace

Informace o používání ConfigureServices a Configure metod s minimálním modelem hostování najdete v tématech:

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 spuštění aplikace najdete v tématu ASP.NET Základní přehled.

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

IStartupFilter použijte:

  • Konfigurace middlewaru na začátku nebo 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, aby jiná komponenta volala Use{Middleware} jménem autora aplikace.
  • Vytvoření kanálu Configure metod IStartupFilter.Configure může nastavit middleware, který se má spustit před nebo po přidání middlewaru knihovnami.

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

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

Následující příklad ukazuje, jak zaregistrovat middleware s 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);
    }
}

Konfiguruje se RequestSetOptionsMiddleware 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 registrován 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 option řetězce dotazu, middleware zpracuje přiřazení hodnoty před middlewarem ASP.NET Core 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í provádění middlewaru IStartupFilter je nastaveno pořadím registrací:

  • Několik IStartupFilter implementací může pracovat se stejnými objekty. Pokud je řazení důležité, objednejte si IStartupFilter registrace služeb tak, aby odpovídaly objednávce, kterou by měly spouštět jejich middlewary.

  • Knihovny mohou přidat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného v IStartupFilteraplikaci . 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 volat později, umístěte registraci služby po přidání knihovny.

Poznámka: Při přepsání Configurenení možné rozšířit aplikaci ASP.NET Core. 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řidání vylepšení do 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 aplikace Core používají Startup třídu, která je pojmenovaná 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 se registrují a ConfigureServices využívají v rámci aplikace prostřednictvím injektáže závislostí (DI) nebo ApplicationServices.
  • Obsahuje metodu Configure pro vytvoření kanálu zpracování požadavků aplikace.

ConfigureServices při Configure spuštění aplikace volá modul runtime ASP.NET Core:

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 hostitelů:

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. Hostitelské i aplikační služby jsou dostupné v Configure celé aplikaci i v celé aplikaci.

Při použití obecného hostiteleIHostBuilder (Startup):

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 Configure se metoda nevolá.

Více 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 je aplikace spuštěná ve vývojovém prostředí a zahrnuje Startup třídu i StartupDevelopment třídu, použije se StartupDevelopment tato 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 spuštění naleznete v tématu Zpracování výjimek při spuštění.

Metoda ConfigureServices

Metoda ConfigureServices je:

  • Nepovinné.
  • Zavolá hostitel před metodou Configure pro konfiguraci služeb aplikace.
  • Kde jsou možnosti konfigurace nastaveny podle konvence.

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

Pro funkce, které vyžadují dodatečné nastavení, existují Add{Service} metody rozšíření .IServiceCollection 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 aplikaci a v Configure metodě. Služby jsou vyřešeny prostřednictvím injektáže závislostí nebo z ApplicationServices.

Metoda Configure

Metoda Configure se používá k určení způsobu, jakým aplikace reaguje na požadavky HTTP. Kanál požadavku je nakonfigurovaný 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ří IApplicationBuilder a předá ho přímo do Configure.

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

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 metoda rozšíření přidá do kanálu požadavku jednu nebo více komponent middlewaru. Například nakonfiguruje middleware tak, UseStaticFiles aby sloužil statickým souborům.

Každá komponenta middlewaru v kanálu požadavku je v případě potřeby zodpovědná za vyvolání další komponenty v kanálu nebo zkratování řetězu.

V podpisu metody je možné zadat další služby, například IWebHostEnvironment, nebo ILoggerFactorycokoli, co je ConfigureServicesv něm definováno Configure . Tyto služby se vloží, pokud jsou k dispozici.

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

Konfigurace služeb bez spuštění

Konfigurace služeb a kanálu zpracování požadavků bez použití Startup třídy, volání ConfigureServices a Configure usnadnění metody v tvůrci hostitelů. Více volání, která se mají ConfigureServices připojit k sobě. Pokud existuje více Configure volání metod, 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í po spuštění pomocí spouštěcích filtrů

IStartupFilter použijte:

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

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

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

Následující příklad ukazuje, jak zaregistrovat middleware s 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);
    }
}

Konfiguruje se RequestSetOptionsMiddleware ve RequestSetOptionsStartupFilter třídě:

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

Je IStartupFilter registrován 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 option řetězce dotazu, middleware zpracuje přiřazení hodnoty před ASP.NET Core middleware vykreslí odpověď.

Pořadí provádění middlewaru IStartupFilter je nastaveno pořadím registrací:

  • Několik IStartupFilter implementací může pracovat se stejnými objekty. Pokud je řazení důležité, objednejte si IStartupFilter registrace služeb tak, aby odpovídaly objednávce, kterou by měly spouštět jejich middlewary.

  • Knihovny mohou přidat middleware s jednou nebo více IStartupFilter implementacemi, které běží před nebo po jiném middlewaru aplikace zaregistrovaného v IStartupFilteraplikaci . 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 volat 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