ASP.NET Core中的應(yīng)用啟動

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)用翘瓮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮折,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子资盅,更是在濱河造成了極大的恐慌调榄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵扛,死亡現(xiàn)場離奇詭異每庆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)今穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門缤灵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事腮出√唬” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵胚嘲,是天一觀的道長富蓄。 經(jīng)常有香客問我,道長慢逾,這世上最難降的妖魔是什么立倍? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侣滩,結(jié)果婚禮上口注,老公的妹妹穿的比我還像新娘。我一直安慰自己君珠,他們只是感情好寝志,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著策添,像睡著了一般材部。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唯竹,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天乐导,我揣著相機(jī)與錄音,去河邊找鬼浸颓。 笑死物臂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产上。 我是一名探鬼主播棵磷,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晋涣!你這毒婦竟也來了仪媒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤谢鹊,失蹤者是張志新(化名)和其女友劉穎算吩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇贺,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赌莺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了松嘶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艘狭。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巢音,到底是詐尸還是另有隱情遵倦,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布官撼,位于F島的核電站梧躺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏傲绣。R本人自食惡果不足惜掠哥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秃诵。 院中可真熱鬧续搀,春花似錦、人聲如沸菠净。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毅往。三九已至牵咙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攀唯,已是汗流浹背洁桌。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留革答,地道東北人战坤。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像残拐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碟嘴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容