ASP.NET Core 知多少(1):從官方模板開(kāi)始

ASP.NET Core知多少系列:總體介紹及目錄

1. 模板項(xiàng)目一覽

如果創(chuàng)建ASP.NET Core Web Application,目前官方預(yù)置了7種模板項(xiàng)目供我們選擇胆绊。從中我們可以看出氨鹏,既有我們熟悉的MVC、WebAPI压状,又新添加了Razor Page仆抵,以及結(jié)合比較流行的Angular、React前端框架的模板項(xiàng)目种冬×统螅基于給出的模板,我們可以根據(jù)自己的需求選擇合適的模板搭建項(xiàng)目框架著手開(kāi)發(fā)娱两。同時(shí)莺匠,我們也可以基于提供的結(jié)合Angular、React客戶端的模板項(xiàng)目來(lái)實(shí)施前后端分離的開(kāi)發(fā)策略十兢。


web application templates

2. Empty 模板項(xiàng)目

我們先來(lái)看看創(chuàng)建的Empty模板項(xiàng)目結(jié)構(gòu):


Empty Template Project Structure

從圖中可以得知主要由以下幾個(gè)部分組成:

  1. Dependencies:組織項(xiàng)目的依賴關(guān)系趣竣。從圖中我們可以看到依賴被細(xì)化為三個(gè)類別:Analyzers、NuGet旱物、SDK遥缕。其中NuGet是專門為.net設(shè)計(jì)的包管理器,組織從NuGet上安裝的依賴項(xiàng)宵呛;SDK主要是Microsoft底層的系列依賴单匣;其實(shí)還有另外幾個(gè)類別:Projects、Bower、npm户秤。Projects就是直接的項(xiàng)目依賴码秉;Bower是專門為web設(shè)計(jì)的包管理器,用來(lái)組織web前端依賴虎忌;npm是專門為javascript設(shè)計(jì)的包管理器泡徙,用來(lái)組織javascript的相關(guān)依賴。
  2. Properties:其中僅包含launchSettings.json文件膜蠢,該文件用于指定應(yīng)用程序的啟動(dòng)設(shè)置堪藐。
  3. wwwroot:根目錄,一般用來(lái)定義靜態(tài)文件挑围,如js礁竞、css、html杉辙、img模捂、ico等等。
  4. Program:程序入口蜘矢,其中定義了Main函數(shù)作為入口函數(shù)狂男。從這一點(diǎn)可以看出,其實(shí)質(zhì)是控制臺(tái)應(yīng)用品腹。
  5. Startup:程序啟動(dòng)類岖食。

2.1. 啟動(dòng)設(shè)置之launchSettings.json

首先該json文件中配置的屬性可以參考launchSettings.json

2.2. 入口函數(shù)之Main函數(shù)

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

ASP.NET Core應(yīng)用程序需要由Host(宿主)進(jìn)行管理舞吭,宿主為其提供運(yùn)行環(huán)境并負(fù)責(zé)啟動(dòng)泡垃。所以Main函數(shù)主要是用來(lái)初始化宿主環(huán)境,而宿主環(huán)境的初始化需要借助WebHostBuilder羡鸥。初始化完畢后蔑穴,調(diào)用Run()方法來(lái)啟動(dòng)應(yīng)用程序。

  1. WebHost.CreaateDefaultBuilder():創(chuàng)建WebHostBuilder惧浴。
  2. UseStartup<Startup>():指定啟動(dòng)類存和,用于依賴注入和中間件注冊(cè)。
  3. Build():返回初始化完畢的IWebHost宿主衷旅。
  4. Run():?jiǎn)?dòng)WebHost哑姚。

2.3. 宿主構(gòu)造器之WebHostBuilder

以上Program的簡(jiǎn)單幾行代碼,完成了一個(gè)應(yīng)用程序的配置和啟動(dòng)芜茵。但簡(jiǎn)潔的代碼不見(jiàn)得簡(jiǎn)單叙量。我們結(jié)合源碼來(lái)看一看。

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

            if (env.IsDevelopment())
            {
                var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                if (appAssembly != null)
                {
                    config.AddUserSecrets(appAssembly, optional: true);
                }
            }

            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseIISIntegration()
        .UseDefaultServiceProvider((context, options) =>
        {
            options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
        });
    return builder;
}

主要包含以下幾個(gè)部分:

  1. UseKestrel:使用Kestrel作為Web server九串。
  2. UseContentRoot:指定Web host使用的content root(內(nèi)容根目錄)绞佩,比如Views寺鸥。默認(rèn)為當(dāng)前應(yīng)用程序根目錄。
  3. ConfigureAppConfiguration:設(shè)置當(dāng)前應(yīng)用程序配置品山。主要是讀取 appsettinggs.json 配置文件胆建、開(kāi)發(fā)環(huán)境中配置的UserSecrets、添加環(huán)境變量和命令行參數(shù) 肘交。
  4. ConfigureLogging:讀取配置文件中的Logging節(jié)點(diǎn)笆载,配置日志系統(tǒng)。
  5. UseIISIntegration:使用IISIntegration 中間件涯呻。
  6. UseDefaultServiceProvider:設(shè)置默認(rèn)的依賴注入容器凉驻。

2.4. 啟動(dòng)類之Startup

public class Startup
{
    // This method gets called by the runtime. 
    //Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. 
    //Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

該類主要包括兩個(gè)方法:

  1. ConfigureService:用于依賴服務(wù)注冊(cè)。
  2. Configure:用于指定應(yīng)用程序?qū)⑷绾雾憫?yīng)每一個(gè) HTTP 請(qǐng)求复罐。一般用于注冊(cè)中間件涝登。

其中涉及到下以下幾個(gè)可用服務(wù):

  1. IServiceCollection:當(dāng)前容器中各服務(wù)的配置集合,ASP.NET Core內(nèi)置的依賴注入容器效诅。
  2. IApplicationBuilder:用于構(gòu)建應(yīng)用程序的請(qǐng)求管道胀滚。
  3. IHostingEnvironment :提供了當(dāng)前的 EnvironmentName、WebRootPath 以及 ContentRoot等乱投。

2.5. 啟動(dòng)流程

首先我們需要明白咽笼,我們創(chuàng)建的.net core web application其實(shí)質(zhì)是一個(gè)獨(dú)立的控制臺(tái)應(yīng)用程序,不能直接處理Http請(qǐng)求戚炫,需要借助Web Server向外提供服務(wù)剑刑。.net core中默認(rèn)使用內(nèi)置的支持跨平臺(tái)的Kestrel作為web server(當(dāng)然還有其他web server可供選擇,比如WebListener嘹悼、Http.sys等等)叛甫。Web server是需要宿主環(huán)境來(lái)承載它层宫。比如:Windows 上的IIS杨伙、Windows Services,Linux上的Apache萌腿、Nginx限匣,或者Docker都可以作為Web Server的宿主。

而宿主就是用來(lái)負(fù)責(zé)啟動(dòng)我們的.net core 應(yīng)用程序的毁菱。比如:IIS新增了一個(gè) AspNetCoreModule 模塊米死,它負(fù)責(zé) ASP.NET Core 程序的啟動(dòng)與停止,并能監(jiān)聽(tīng) ASP.NET Core 程序的狀態(tài)贮庞,在我們的應(yīng)用程序意外崩潰時(shí)重新啟動(dòng)峦筒。

IIS作為宿主啟動(dòng) .net core application

當(dāng)僅僅是在內(nèi)網(wǎng)中暴露服務(wù)的話,可以直接使用Kestrel處理http請(qǐng)求窗慎。否則物喷,還是借助反向代理服務(wù)器(IIS卤材、Nginx、Apache等)來(lái)轉(zhuǎn)發(fā)http請(qǐng)求峦失。但一般我們建議結(jié)合使用反向代理服務(wù)器來(lái)處理http請(qǐng)求扇丛,因?yàn)榉聪虼矸?wù)器可以在Kestrel之前做一些額外的處理(了解更多,可參考Introduction to Kestrel web server implementation in ASP.NET Core)尉辑。

Http請(qǐng)求示意圖

通過(guò)以上的描述我們引入了Host與Server的概念帆精。我們可以簡(jiǎn)單理解為host是一個(gè)進(jìn)程用來(lái)管理應(yīng)用程序,而server是用來(lái)暴露應(yīng)用程序服務(wù)的隧魄。也可以理解為host是對(duì)server的一層包裝卓练。

3. MVC vs Razor Page

ASP.NET MVC 是一套基于Microsoft .NET Framework的用來(lái)開(kāi)發(fā)web應(yīng)用程序的開(kāi)源框架。其基于關(guān)注點(diǎn)分離的思想將應(yīng)用程序主要分為三個(gè)部分:Model堤器、View昆庇、Controller。在ASP.NET Core中同樣延續(xù)了MVC的優(yōu)良設(shè)計(jì)闸溃。
ASP.NET MVC中Razor作為一個(gè)高級(jí)視圖引擎存在整吆,Razor提供了一種新的標(biāo)記語(yǔ)義,其大大減少了用戶輸入且具有表現(xiàn)力辉川,主要的特點(diǎn)是使用@符號(hào)去書(shū)寫(xiě)標(biāo)記表蝙。
而在ASP.NET Core中Razor不僅僅是一種視圖引擎,其提供了一種新的頁(yè)面設(shè)計(jì)方式——Razor Page乓旗。其主要的特點(diǎn)在于:

  1. 基于文件路徑的路由系統(tǒng)府蛇;
  2. Razor Page類似于WebForm,一種MVVM的架構(gòu)屿愚,支持雙向綁定汇跨;
  3. Razor Page符合單一職責(zé)原則,每個(gè)頁(yè)面獨(dú)立存在妆距,視圖和代碼緊密組織在一起穷遂。
MVC與Razor Page模板項(xiàng)目結(jié)構(gòu)差異

4. MVC vs WebAPI

本質(zhì)上的區(qū)別在于:ASP.NET MVC 用來(lái)創(chuàng)建web應(yīng)用返回視圖和數(shù)據(jù);但是ASP.NET WEB API 是用來(lái)創(chuàng)建完整的HTTP服務(wù)娱据,僅返回?cái)?shù)據(jù)無(wú)視圖返回蚪黑。

就項(xiàng)目結(jié)構(gòu)而言,差別如下:


5. Angualr 模板項(xiàng)目

我們可以借助Angular來(lái)開(kāi)發(fā)SPA web應(yīng)用中剩,其結(jié)構(gòu)就與MVC相比忌穿,主要多了ClientApp文件夾。其代碼結(jié)構(gòu)如下圖所示:

Angular Template Project

6. 最后

關(guān)于模板項(xiàng)目的介紹就簡(jiǎn)要介紹到這里结啼,我們后續(xù)在結(jié)合實(shí)際運(yùn)用繼續(xù)深入探討掠剑!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郊愧,隨后出現(xiàn)的幾起案子朴译,更是在濱河造成了極大的恐慌沸伏,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动分,死亡現(xiàn)場(chǎng)離奇詭異毅糟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)澜公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門姆另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坟乾,你說(shuō)我怎么就攤上這事迹辐。” “怎么了甚侣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵明吩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我殷费,道長(zhǎng)印荔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任详羡,我火速辦了婚禮仍律,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘实柠。我一直安慰自己水泉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窒盐。 她就那樣靜靜地躺著草则,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟹漓。 梳的紋絲不亂的頭發(fā)上炕横,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音牧牢,去河邊找鬼看锉。 笑死姿锭,一個(gè)胖子當(dāng)著我的面吹牛塔鳍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻此,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轮纫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了焚鲜?” 一聲冷哼從身側(cè)響起掌唾,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤放前,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后糯彬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凭语,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年撩扒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了似扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搓谆,死狀恐怖炒辉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泉手,我是刑警寧澤黔寇,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站斩萌,受9級(jí)特大地震影響缝裤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颊郎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一倘是、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袭艺,春花似錦搀崭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至答倡,卻和暖如春轰传,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘪撇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工获茬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倔既。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓恕曲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渤涌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佩谣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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