iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
2
Modern Web

打net core肉飯系列 第 5

[2020鐵人賽] Day5 - ASP.NET Core運行、生命週期

本章開始會從空的.net core專案開始介紹,主要參考資料是.net core的官方文件,大家有興趣也可以去看看,都講得非常詳細。

ASP.NET Core Application
先來建立一個empty的.net core專案

專案建立好之後,再開啟Program.cs這個檔案,觀察一下,他是什麼?這邊一開始採用的版本是net core 2.1

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace WebVersion2.1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

之後來看一下有用到的方法

  • CreateDefaultBuilder:產生WebHost的物件,反正就是一個前置準備,主要包含
    • 將Kestrel伺服器設定為網頁伺服器
    • 載入組態、環境變數、重設跟目錄
    • 啟用iis整合
  • UseStartup<執行類別>:預設裡面是放Startup class(也可以換成自己想要的class)。
  • Build():實體化Webhost,回傳IWebHost。
  • Run():執行Webhost。

小結:基於以上我們瞭解到Program.cs

  • 他是一個主控台應用程式(console app)
  • 他是透過Main()來建立啟動伺服器(建立虛擬主機)

PS.若有興趣的話,可以new一個新版3.1版的專案,會發現Program.cs略有不同

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace WebVersion3.1
{
    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>();
                });
    }
}

觀察以上,可發現:

  • 由WebHost改成了Host去執行CreateDefaultBuilder
  • 移除了類別(WebHostBuilder)而保留了介面(IWebHostBuilder)

接著看Startup.cs這個檔案,注意,此由Program.cs中的UseStartup去初始化這個Startup類別,是也可以把此類別在WebHost Builder中去設定。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace WebVersion3.1
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseStaticPage();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Test}/{action=Index}/{id?}");
            });
        }
    }
}

Startup類別的主要目的

  • 定義網站需要的service
  • 定義request handling pipeline

而Startup類別又有以下兩方法

  • ConfigureServices:是option的,但若有這個方法則會比Configure方法先執行,此方法中將服務(Service)加入(Add)後,便可在Configure中使用(Use)。
  • Configure:是required的,主要是放middleware,IApplicationBuilder是必要參數,在ConfigureServices加入(Add)後,就可以在Configure中使用(Use)。

總結:
生命週期真的是每次去瞭解都快睡著,但第一步是一定要去弄懂的,因為這個跟以前mvc5是完全不一樣的執行方式,故值得去研究清楚。

參考資料
https://wakeupandcode.com/generic-host-builder-in-asp-net-core-3-1/
https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.1
https://github.com/aspnet/MetaPackages/blob/633cb681493c0958a9d215624c173db29e20c23d/src/Microsoft.AspNetCore/WebHost.cs
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#the-configure-method


上一篇
[2020鐵人賽] Day4 - Html/JavaScript/CSS
下一篇
[2020鐵人賽] Day6 - 模型(Model)(1/3)
系列文
打net core肉飯30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言