- 本文翻譯自微軟官方文檔:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-7.0
- 對應(yīng)ASP.NET Core版本為ASP.NET Core 7.0
ASP.NET Core應(yīng)用使用web模板啟動,模板會生成包含啟動代碼的Program.cs文件卧秘。
以下應(yīng)用啟動代碼支持:
- Razor Pages
- 具有視圖的 MVC 控制器(MVC controllers with views)
- 具有控制器的 Web API(Web API with controllers)
- Minimal APIs
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();
使用 EventSource 的應(yīng)用可以度量啟動時間鳍徽,以了解和優(yōu)化啟動性能钻心。 Microsoft.AspNetCore.Hosting中的ServerReady事件表示服務(wù)器準(zhǔn)備相應(yīng)請求的點(diǎn)犀填。.
使用startup filters擴(kuò)展Startup
使用IStartupFilter:
- 無需顯式調(diào)用 Use{Middleware}就可以在應(yīng)用的中間件請求管道的開頭或結(jié)尾配置中間件隐岛。使用 IStartupFilter 在不顯式注冊默認(rèn)中間件的情況下將默認(rèn)值添加到管道的開頭螺垢。IStartupFilter 允許代表應(yīng)用作者使用不同的組件調(diào)用 Use{Middleware}。
-創(chuàng)建 Configure 方法的管道串绩。 IStartupFilter.Configure 可以將中間件設(shè)置為在庫添加的中間件之前或之后運(yùn)行缺虐。
IStartupFilter 實(shí)現(xiàn) Configure,即接收并返回 Action<IApplicationBuilder>礁凡。 IApplicationBuilder 定義用于配置應(yīng)用請求管道的類高氮。
在請求管道中每個IStartupFilter可以添加一個或多個中間件。篩選器按照添加到服務(wù)容器的順序調(diào)用顷牌。篩選器按照添加到服務(wù)容器的順序調(diào)用剪芍。 篩選器可在將控件傳遞給下一個篩選器之前或之后添加中間件,從而附加到應(yīng)用管道的開頭或末尾窟蓝。
下面的示例演示如何使用 IStartupFilter 注冊中間件罪裹。 RequestSetOptionsMiddleware 中間件從查詢字符串參數(shù)中設(shè)置選項值:
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);
}
}
在 RequestSetOptionsStartupFilter 類中配置 RequestSetOptionsMiddleware:
namespace WebStartup.Middleware;
// <snippet1>
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
// </snippet1>
在 Program.cs 中注冊IStartupFilter :
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();
當(dāng)提供 option 的查詢字符串參數(shù)時,中間件在 ASP.NET Core 中間件呈現(xiàn)響應(yīng)之前處理分配值:
@page
@model PrivacyModel
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];
中間件執(zhí)行順序由 IStartupFilter 注冊順序決定:
- 多個 IStartupFilter 實(shí)現(xiàn)可能與相同的對象進(jìn)行交互疗锐。 如果順序很重要坊谁,請將它們的 IStartupFilter 服務(wù)注冊進(jìn)行排序,以匹配其中間件應(yīng)有的運(yùn)行順序滑臊。
- 庫可能添加包含一個或多個 IStartupFilter 實(shí)現(xiàn)的中間件,這些實(shí)現(xiàn)在向 IStartupFilter 注冊的其他應(yīng)用中間件之前或之后運(yùn)行箍铲。 若要在庫的 IStartupFilter 添加的中間件之前調(diào)用 IStartupFilter 中間件雇卷,請執(zhí)行以下操作:
-在庫添加到服務(wù)容器之前定位服務(wù)注冊。
-要在此后調(diào)用颠猴,請在添加庫之后定位服務(wù)注冊关划。
注意:重寫 Configure 時,無法擴(kuò)展 ASP.NET Core 應(yīng)用翘瓮。