BACK
Featured image of post 關於 ASP.NET Core 7.0 的啟動設定檔 (Launch Settings)

關於 ASP.NET Core 7.0 的啟動設定檔 (Launch Settings)

由於 ASP.NET Core 7.0 與 ASP.NET Core 6.0 的專案範本中的啟動設定檔(Launch Settings)有些許不同,所以來整理一下相關知識,更好的認識這個 Properties\launchSettings.json 檔案。

參考網站
參考網站
參考網站
參考網站
轉載自網站

由於 ASP.NET Core 7.0 與 ASP.NET Core 6.0 的專案範本中的啟動設定檔(Launch Settings)有些許不同,所以來整理一下相關知識,更好的認識這個 Properties\launchSettings.json 檔案。


先看看 Properties\launchSettings.json 的差異

先用 dotnet new mvc 在 ASP.NET Core 6.0 與 ASP.NET Core 7.0 產生一樣的專案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 6.0
mkdir projectV6
cd projectV6

dotnet new globaljson --sdk-version 6.0.100 --roll-forward latestFeature
dotnet --version
dotnet new mvc

# 7.0
mkdir projectV7
cd projectV7

dotnet new globaljson --sdk-version 7.0.100 --roll-forward latestFeature
dotnet --version
dotnet new mvc

由於專案範本不同,專案內的 Properties\launchSettings.json 檔案內容其實不太一樣:

ASP.NET Core 6.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:22303",
      "sslPort": 44378
    }
  },
  "profiles": {
    "m1": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7007;http://localhost:5183",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

ASP.NET Core 7.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:9601",
      "sslPort": 44330
    }
  },
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7068;http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

從上述內容你可以很清楚的發現 ASP.NET Core 6.0 與 ASP.NET Core 7.0 有以下 2 點差異:

  1. ASP.NET Core 6.0 的 profiles 只有兩個,但是 ASP.NET Core 7.0 的 profiles 卻有三個!
  2. ASP.NET Core 6.0 的第一個 Profile 預設名稱為「專案名稱」(projectV6),而 ASP.NET Core 7.0 的第一個 Profile 名稱卻是 http,而且還多出一個 https 設定檔。

其實在 ASP.NET Core 6.0 以前,所有的專案範本中第一個 Profile 預設名稱都為「專案名稱」,所以其實大家對這個名字沒有什麼感覺,直到 ASP.NET Core 7.0 做出了改變,這才有人發現原來這東西的用途。


不載入啟動設定檔

從 ASP.NET Core 6.0 開始,透過 dotnet new 專案範本所建立的 ASP.NET Core 專案,預設都不會繼續使用早期的 Port 5000 (http) 與 Port 5001 (https),可能是因為多專案的架構下太容易衝突,而且太多人不清楚啟動設定檔的存在,所以就改成用亂數的 Port 埠號。

但是亂數的 Port 埠號其實很難寫文件,所以我為了讓學員檢測自己是否有成功裝好 .NET SDK 工具,我會這樣寫:

1
2
3
4
5
6
7
8
# 建立並進入資料夾
mkdir projectV7 && cd projectV7

# 建立 ASP.NET Core MVC 專案範本
dotnet new mvc

# 啟動網站並忽略啟動設定檔
dotnet run --no-launch-profile

這裡的 --no-launch-profile 就是避免 dotnet new 去讀取專案中的 Properties\launchSettings.json 啟動設定檔,而 .NET Runtime 的 dotnet run 命令,在沒有載入啟動設定檔的情況下,在 ASP.NET Core 6.0 與 ASP.NET Core 7.0 有細微的差異:

  • 預設 ASP.NET Core 6.0 網站會監聽 Port 5000 (http) 與 Port 5001 (https)。
  • 預設 ASP.NET Core 7.0 網站會監聽 Port 5000 (http)。

由於 ASP.NET Core 的 TLS 自簽憑證預設只有一年效期,每年都要更新,雖然更新很簡單,命令如下:

1
2
dotnet dev-certs https --clean
dotnet dev-certs https --trust

應該是有很多人搞不定 https 問題,才讓微軟決定降低開發門檻,直接把預設 https 的 binding 移除!


啟動設定檔的用法

我們在執行 dotnet run 的時候,只要沒特別指定啟動設定檔,預設就會自動載入 Properties\launchSettings.json 設定檔中的第一個 profiles 中的設定,由於 ASP.NET Core 7.0 的「第一個」是 http 這個名字:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  // ...
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    // ...
  }
  // ...
}

所以當網站啟動時,我們的 applicationUrl 預設就只有 http 的網址而已,因此網站啟動時並不會有 https 可以測試!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
dotnet run

> Building...
> info: Microsoft.Hosting.Lifetime[14]
>       Now listening on: http://localhost:5041
> info: Microsoft.Hosting.Lifetime[0]
>       Application started. Press Ctrl+C to shut down.
> info: Microsoft.Hosting.Lifetime[0]
>       Hosting environment: Development
> info: Microsoft.Hosting.Lifetime[0]
>       Content root path: G:\Projects\projectV7

那如果我們也想測試 https 網址怎麼辦,這時你就可以選擇 Properties\launchSettings.json 設定檔中的第二個 profiles 中的設定:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  // ...
  "profiles": {
    // ...
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7068;http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
  // ...
}

其啟動的方式如下:

1
2
3
4
dotnet run --launch-profile "https"

# 或者可以簡寫成這樣:
# dotnet run -lp "https"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
dotnet run --launch-profile "https"

> Building...
> info: Microsoft.Hosting.Lifetime[14]
>       Now listening on: https://localhost:7068
> info: Microsoft.Hosting.Lifetime[14]
>       Now listening on: http://localhost:5041
> info: Microsoft.Hosting.Lifetime[0]
>       Application started. Press Ctrl+C to shut down.
> info: Microsoft.Hosting.Lifetime[0]
>       Hosting environment: Development
> info: Microsoft.Hosting.Lifetime[0]
>       Content root path: G:\Projects\projectV7

深入瞭解啟動設定檔

在啟動設定檔中有個 launchBrowser 屬性,預設為 true,從字面上來看,就是「啟動瀏覽器」的意思。但其實我們用 dotnet run 並不會因為 launchBrowser 為 true 就開啟網頁,而是要透過 dotnet watch 命令啟動網站才會真的啟動瀏覽器並開啟網頁!

另一方面,你可能會發現我們在 Visual Studio 2022 裡面每次啟動網站都會開啟網頁,這時我其實也會覺得這個設計很煩,每次都一直不斷的開啟新頁籤,其實蠻惱人的。而關掉的方法,就是調整啟動設定檔中的 launchBrowser 屬性,調整為 false 即可!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  // ...
  "profiles": {
    // ...
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "https://localhost:7068;http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
  // ...
}

另外還有一個 dotnetRunMessages 也是個謎一般的存在,完全沒有文件說明,而這個設定也確實沒太多存在感!各位可以看下圖差異之處,只有在 dotnet run 啟動的時候有非常細微的差異而已。我們在透過 dotnet run 啟動網站時,由於要先 dotnet build 過才能真正 Run 起來,而這段時間大概會跑個 2 ~ 3 秒左右,如果在 dotnetRunMessages 為 true 時,在 Console 會優先出現一個 Building… 字樣,讓你知道 dotnet run 沒掛掉,他只是還在跑而已,否則你會有 2 ~ 3 秒的空白,有人會覺得好像程式沒啟動,感覺怪怪的!😅

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# dotnetRunMessage = true 時
dotnet run

> Building...
> info: Microsoft.Hosting.Lifetime[14]
>       Now listening on: http://localhost:5041
> info: Microsoft.Hosting.Lifetime[0]
>       Application started. Press Ctrl+C to shut down.
> info: Microsoft.Hosting.Lifetime[0]
>       Hosting environment: Development
> info: Microsoft.Hosting.Lifetime[0]
>       Content root path: G:\Projects\projectV7
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# dotnetRunMessage = false 時
dotnet run

> info: Microsoft.Hosting.Lifetime[14]
>       Now listening on: http://localhost:5041
> info: Microsoft.Hosting.Lifetime[0]
>       Application started. Press Ctrl+C to shut down.
> info: Microsoft.Hosting.Lifetime[0]
>       Hosting environment: Development
> info: Microsoft.Hosting.Lifetime[0]
>       Content root path: G:\Projects\projectV7

詳見 Purpose of dotnetRunMessages in launchSettings.json - Stack Overflow 說明。

最後,還有個 commandName 也是謎一般的存在,依然完全沒有文件說明,但在 Stack Overflow 有篇文章有做詳細說明,其設定值有可能是以下四種:

  • Project

將當前的這個應用程式作為控制台應用程式運行,這裡的設定跟你用 dotnet run 執行是相同的。

  • IIS Express

預設使用 IIS Express 開發伺服器來執行 ASP.NET Core 應用程式。

這個選項只能用在 Visual Studio 而已,.NET CLI 是不支援的!

  • IIS

當你在本機安裝 IIS 後,您可以讓您的應用程式直接在 IIS 執行。

這個選項只能用在 Visual Studio 而已,.NET CLI 是不支援的!

  • Executable

這讓你可以執行任意執行檔、傳入任意參數,非常靈活的設定!

這個選項只能用在 Visual Studio 而已,.NET CLI 是不支援的!

例如你不想用 Visual Studio 2022 內建難用的 Hot Reload 的話,可以這樣設定:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  // ...
  "Watch": {
    "commandName": "Executable",
    "dotnetRunMessages": true,
    "executablePath": "dotnet",
    "commandLineArgs": "watch run",
    "workingDirectory": "$(ProjectDir)",
    "launchBrowser": true,
    "applicationUrl": "https://localhost:5001;http://localhost:5000",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    }
  }
  // ...
}
comments powered by Disqus