Spuštění aplikace v ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. 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 ve verzi .NET 8 tohoto článku.
Autor: Rick Anderson
Aplikace ASP.NET Core vytvořené pomocí webových šablon obsahují spouštěcí kód aplikace v souboru Program.cs
.
Pokyny Blazor ke spuštění, které se přidávají nebo nahrazují pokyny v tomto článku, najdete v tématu ASP.NET spuštění coreBlazor.
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 volalaUse{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.
IStartupFilter
implementuje 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 siIStartupFilter
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 vIStartupFilter
aplikaci . Vyvolání middlewaruIStartupFilter
před middlewarem přidaným knihovnouIStartupFilter
:- 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í Configure
není 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:
- Použití startupu s minimálním modelem hostování
- Verze tohoto článku ASP.NET Core 5.0:
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 volalaUse{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.
IStartupFilter
implementuje 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 siIStartupFilter
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 vIStartupFilter
aplikaci . Vyvolání middlewaruIStartupFilter
před middlewarem přidaným knihovnouIStartupFilter
:- 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í Configure
není 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 AddDbContext, AddDefaultIdentity, Add EntityFrameworkStores a 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();
}
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 middlewaru IApplicationBuilder 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:
- Stránka výjimky pro vývojáře
- Obslužná rutina výjimky
- HTTP Strict Transport Security (HSTS)
- Přesměrování HTTPS
- Statické soubory
- ASP.NET Core MVC a Razor stránky
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 ILoggerFactory
cokoli, co je ConfigureServices
v 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 volalaUse{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.
IStartupFilter
implementuje 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 siIStartupFilter
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 vIStartupFilter
aplikaci . Vyvolání middlewaruIStartupFilter
před middlewarem přidaným knihovnouIStartupFilter
:- 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.