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 volatUse{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í IStartupFilter
ná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 registraceIStartupFilter
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í 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 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 volatUse{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í IStartupFilter
ná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 registraceIStartupFilter
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í 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 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.
ConfigureServices
a 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 Startup
StartupDevelopment
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:
- 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 Pages
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 IWebHostEnvironment
jsou , ILoggerFactory
nebo 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}
metodyIStartupFilter
použí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řaditIStartupFilter
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 vyvolatIStartupFilter
middleware před middlewarem přidaným knihovnouIStartupFilter
:- 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.