﻿# 在 Visual Studio 2022 開發 ASP.NET Core 這樣設定就對了！

其實我大部分時間都在 Visual Studio Code 裡面做開發，久而久之就生疏了 Visual Studio 2022 裡面的各種選項設定，有很多都是近幾年才有的新功能，而有些「預設值」確實不太好用，只要沒特別去研究，就不知道原來只要微調一下就會變的非常方便。這篇文章我就來整理一下 Visual Studio 2022 在開發 ASP.NET Core 時相關的那些重要設定。

![vs2022-asp-net-core-tips](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9e7ac6cbac3d5caf30d8-40af8e7b-f907-48ee-9b3a-c79132aafc9c.webp)

### 啟動但不偵錯 (Start Without Debugging)

我常常跟上我課的學員分享，我寫程式幾乎不進偵錯模式，因為啟動速度太慢了，所以幾乎都不 Debug 的。所以我每次在開發 ASP.NET Core 的時候，都是使用 **啟動但不偵錯** (`Start Without Debugging`) 的方式開啟網站，快速鍵是 `Ctrl + F5`，這樣 Visual Studio 2022 就不會進入偵錯模式，而是直接啟動網站，速度快很多。

![SNAG-0085](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/2bf1c21982ac42311b39-ec1c0a81-0eae-4ef0-8758-39d8f5abe6e6.jpg)

### 自動啟動瀏覽器

這個部分並不是 Visual Studio 2022 的設定，而是 ASP.NET Core 在**啟動網站**時的設定。

由於在 ASP.NET Core 預設的專案範本中，都會有一個 `Properties/launchSettings.json` 檔案，在這份設定檔中，主要有三個區塊，分別是：

1.  `$schema` (宣告這份文件的 JSON Schema URL，用來讓 Visual Studio 2022 能夠提供 JSON 文件的 Intellisense)
2.  `iisSettings` (宣告使用 IIS Express 裝載網站時的 IIS 站台設定)
3.  `profiles` (宣告各種不同的**啟動設定檔**，例如 `http`、`IIS Express` 等等)

```json
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
  },
  "profiles": {
    "http": {
    },
    "IIS Express": {
    }
  }
}
```

由於預設有兩個**啟動設定檔**，分別是 `http` (或 `https`) 和 `IIS Express`：

1.  `http` 設定檔
    
    這個設定檔主要給使用 .NET CLI 直接啟動 ASP.NET Core 時使用，這種啟動方法會開啟一個 `Console` (命令提示字元) 視窗。
    
2.  `IIS Express` 設定檔
    
    這個設定檔主要給使用 IIS Express 裝載並啟動 ASP.NET Core 應用程式時使用，這種啟動方法不會有 `Console` 視窗，所以你會看不到 `Console` 的訊息。
    

這兩個設定檔都有一個 `launchBrowser` 屬性，且屬性預設是 `true`，這個設定會你在按下 `Ctrl+F5` (啟動但不偵錯) 時，每次都會開啟瀏覽器頁籤，在自動重整網站時也會自動開啟瀏覽器頁籤，如果只開一次的話，當然是很貼心，但第二次按下 `Ctrl+F5` (啟動但不偵錯) 時，又開一個新的頁籤就很煩人了！

所以，要不要關掉呢？答案是：**維持預設值！開著！因為我稍後會說明最完美的設定方法！**

![SNAG-0087](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/c14c95429dda52fd2a07-481faac5-1e04-42a8-ac2e-236cd3fc503b.jpg)

### \[工具\] -> \[選項\] -> \[專案和方案\] -> \[ASP.NET Core\]

這裡的選項就是本篇文章的重點之處，好的設定讓你上天堂，好用的不要不要的！👍

我直接顯示我認為最完美的設定，照著設定就可以：

![SNAG-0089](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/6fc7f83f72fb4d2d3911-32e35ecd-25e1-40c4-8091-46412b62ca7c.jpg)

以下是每個選項的詳細解說：

-   一般
    
    -   **自動建置並重新整理瀏覽器** (Auto build and refresh option)
        
        選項用於在專案進行更改並執行 Web 伺服器時，自動建置並重新整理瀏覽器。這些設定適用於**不支援熱重新載入**或**已禁用熱重新載入**的應用程式。
        
        這裡有 4 個選項：
        
        1.  `None`  
            不自動建置或重新整理瀏覽器
        2.  `Auto build on browser request (IIS only)`  
            在 IIS 上僅在瀏覽器請求時自動建置
        3.  `Refresh browser after build`  
            在建置後重新整理瀏覽器
        4.  `Auto build and refresh browser after saving changes`  
            在專案儲存更改後自動建置並重新整理瀏覽器
        
        > 我覺得最好的選項就是最後一個，因為在不支援 Hot Reload (熱重新載入) 的情況下，這個選項可以讓你在儲存檔案後，自動建置並重新整理瀏覽器，這樣就不用手動按 `Ctrl+F5`，同時也意味著不會自動開啟瀏覽器頁籤！👍
        
    -   **建置後自動重新啟動 Kestrel 伺服器** (Auto restart Kestrel server after build: True)
        
        如果 Kestrel 伺服器在建置之前正在執行，則自動重新啟動 Kestrel 伺服器。
        
        > 這個選項肯定要打開，因為只要你先前正在執行的 Kestrel 還在執行時，所有的 \*.dll 檔案會被鎖定，這會導致 Visual Studio 2022 會無法順利建置你的專案，只要經常不能建置，你一定會覺得很煩！啟用這個設定後，你在建置專案時，他就會去自動判斷目前是否有正在執行的 Kestrel 伺服器 (其實就是 ASP.NET Core 應用程式啦)，如果有找到，就會自動幫你停止，然後再重新啟動，這樣就不會有檔案被鎖定的問題了！👍
        
    -   **CSS 熱重新載入** (CSS Hot Reload: Enabled)
        
        在編輯時啟用在瀏覽器中熱重新載入 CSS 更改。
        
        > 顧名思義，當你在 ASP.NET Core MVC 修改 CSS 的時候，網頁不用重新整理，更新後的 CSS 就會自動套用到網頁上，連專案都不用重新建置，非常的方便！👍
        
-   輸出選項
    
    -   **最小化啟動外部控制台** (Launch external console minimized)
        
        在外部 Console 中執行 ASP.NET Core Web 伺服器時，最小化或正常啟動。
        
        > 設定為 `True` 時，額外開啟的 Console 視窗會自動進行最小化，這樣就不會一直跳出來，影響你的工作。但如果你是像我一樣有時候有授課的需求，經常要跟學員展示 Console 的內容時，你也可以設定為 `False`，這樣每次 Kestrel 重新啟動時，這個 Console 視窗就會自動被提升到最前面顯示，你會優先看到 Console 的訊息內容。👍
        
    -   **在以下位置執行 Web 伺服器** (Run web server in)
        
        在 Visual Studio 的整合終端或外部 Windows Console 中執行 ASP.NET Core Web 伺服器。
        
        這裡有 2 個選項：
        
        1.  `External Console` (會額外開啟一個 Console 命令提示字元視窗)
        2.  `Integrated Terminal` (會在 Visual Studio 裡面額外開啟一個新的窗格)
        
        > 你只要選擇 `Integrated Terminal` 就保證會煩死你，因為你每次重新啟動 Kestrel 他都會不斷開啟新的 Terminal 視窗，真的超級干擾的。所以保留預設值的 `External Console` 應該才是最佳選擇！👍
        
    -   **使用共用的 Web 伺服器輸出視窗** (Use shared web server output window)
        
        將每個專案的 Web 伺服器輸出重定向到其自己的輸出視窗，或者交錯到共用的輸出視窗中。
        
        > 這個設定我完全看不懂怎麼用，測不出任何差異或有任何好處，不要動他即可。👎
        

### \[工具\] -> \[選項\] -> \[偵錯\] -> \[一般\]

`Hot Reload` (熱重新載入) 是個好東西，請務必記得啟用他。只要啟用了這個 `Enable Hot Reload` 設定後，Visual Studio 2022 預設會監控你的整個專案，他會在你有修改任何 `*.cs` 或 `*.json` 檔案時，自動重新載入正在執行的 ASP.NET Core 應用程式，這樣可以大幅減少**重新建置**與**重新啟動**的時間！👍

![SNAG-0107](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/13209a95eab0856511bb-00b58005-73c2-44f6-b291-9ce914a5666f.jpg)

不過，你在 Visual Studio 2022 幫你開啟的 Windows Console 視窗中，不一定會看到 Hot Reload 的訊息。在修改 `appsettings.*.json` 時，會顯示以下訊息：

```
dbug: Microsoft.AspNetCore.Server.Kestrel[0]
      Config reload token fired. Checking for changes...
```

但在修改 `*.cs` 的時候，就看不到 Hot Reload 的資訊了，但你可以在 Visual Studio 2022 的 `Output` 視窗中，選擇 `Hot Reload` 類別，這樣就可以看到 Hot Reload 的訊息了！

### \[工具\] -> \[選項\] -> \[偵錯\] -> \[.NET / C++ Hot Reload\]

這裡是設定 Hot Reload 的一些相關選項，建議可以全部啟用，可以大幅改善 ASP.NET Core 的開發體驗！👍

![SNAG-0110](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/57eb69de3c9408c2260d-aa1cdb30-9bcf-4a7e-8c7a-3712901f3f27.jpg)

-   **啟用熱重新載入** (Enable Hot Reload)
    
    這肯定要勾選！✅
    
-   **在不進行偵錯的情況下啟用熱重新載入** (Enable Hot Reload when starting without debugging)
    
    這個選項是在你按下 `Ctrl+F5` (啟動但不偵錯) 時，是否要啟用 `Hot Reload`，這個選項當然也要勾選！✅
    
-   **在檔案儲存時應用熱重新載入** (Apply Hot Reload on File Save)
    
    這個選項是在你儲存檔案時，是否要啟用 `Hot Reload`，這個選項當然也要勾選！✅
    
-   **設定日誌詳細程度** (Logging verbosity: Minimal)
    
    這個選項是設定 `Hot Reload` 的日誌詳細程度，預設是 `Minimal`，這個設定就夠用了，不用再調整。👍
    

除了選項設定外，也有 Visual Studio 2022 的工具列也可以快速設定：

![SNAG-0109](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/08212d43e3d103362126-fb880be8-7725-46b5-8a20-f4c69c890039.jpg)

然而，並非所有的程式碼修改，都可以順利的套用 Hot Reload 機制，當無法套用的時候，就會出現以下對話框，建議勾選 `Always rebuild when changes can't be applied` 選項，他就不會再問你了，下次就會直接重新建置並自動啟動網站。不過這個選項不會保存下來，你只要重開 Visual Studio 2022 下次還是會再看到一次。

![SNAG-0114](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/12bd01e3d22368bdffd9-8949d292-98c3-4699-88a2-c9b5ba1cc23c.jpg)

### 調整 REST API Editor 的「送出要求」快速鍵

從 Visual Studio 2022 的 `v17.5` 開始，就有內建一個超級好用的 REST API 編輯器 ([REST API Editor](https://learn.microsoft.com/en-us/aspnet/core/test/http-files))，當我們要送出 HTTP 要求時，Visual Studio 2022 並沒有提示我們鍵盤的快速鍵是什麼，所以很多人並不知道可以透過 `Ctrl+Alt+S` 快速送出 HTTP 要求，常用的人可以記起來！

![SNAG-0112](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/b52ba623145eb671e7d3-5e946c1d-c5b4-4188-8a9a-f187e880a538.jpg)

不過，我在 Visual Studio Code 也會用 `.http` 檔案，只要搭配 [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) 擴充套件，就可以做到一樣的事。而我在 Visual Studio Code 那邊的快速鍵是 `Ctrl+Enter`，所以我習慣把 Visual Studio 2022 的快速鍵也設定為 `Ctrl+Enter`，這樣就不用記兩種快速鍵了！👍

> 事實上 Visual Studio Code 的 [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) 擴充套件比 Visual Studio 2022 還好用，大家有興趣可以深入研究。

### 加入 `.editorconfig` 統一程式碼風格

Visual Studio 2022 預設的變數命名規則跟 ASP.NET Core 專案範本中的變數命名並不一致，我先前在 YouTube 有分享過一部 [Visual Studio 2022 如何設定預設變數命名規則](https://www.youtube.com/watch?v=_pdrGs9SKZw) 教學影片，影片中有詳細的說明這個問題，也有分享設定的方法，由於設定過程有點複雜，建議大家看影片比較清楚！

<iframe title="YouTube video player" src="https://www.youtube.com/embed/_pdrGs9SKZw?si=Fb65hKYTZ6QQycBX" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe>

以下是我設定好的畫面截圖：

![Visual Studio 2022 > Options > Text Editor > C# > Code Style > Naming](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/56378eab20c069cab25f-22cbe7c6-bff5-4c43-9f97-090e7debe423.jpg)

但是每個人都要設定這麼多選項，實在是太麻煩了，所以我建議是透過 `.editorconfig` 來統一專案的程式碼風格，這樣就不用每個人分別設定了。

1.  先加入 Visual Studio 2022 內建的 `.editorconfig` 設定檔，你可以參考下圖來新增
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/8ef37c55dec776c1c24b-367c082d-f1d5-4b5a-b555-8b1e18cf3766.png)
    
2.  直接在專案中加入我已經設定好的 `.editorconfig` 設定檔內容片段：
    
    以下片段直接加入到 `.editorconfig` 的最後一行下方即可，主要設定 `*.cs` 一定要以 `UTF-8 with BOM` 來儲存檔案，其餘就是統一 `private` 與 `internal` 的欄位要以 `_` (底線) 開頭，統一變數命名規則！
    
    ```ini
    [*.cs]
    
    charset = utf-8-bom
    
    #### Naming styles ####
    
    # Symbol specifications
    
    dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
    dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
    dotnet_naming_symbols.private_or_internal_field.required_modifiers =
    
    # Naming rules
    
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.severity = suggestion
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.symbols = private_or_internal_field
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.style = prefix__
    
    # Naming styles
    
    dotnet_naming_style.prefix__.required_prefix = _
    dotnet_naming_style.prefix__.required_suffix =
    dotnet_naming_style.prefix__.word_separator =
    dotnet_naming_style.prefix__.capitalization = camel_case
    ```
    

### 相關連結

-   [Introducing the .NET Hot Reload experience for editing code at runtime](https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/)
-   [.NET Hot Reload support for ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/test/hot-reload)
-   [Use .http files in Visual Studio 2022](https://learn.microsoft.com/en-us/aspnet/core/test/http-files)
-   [Overview of .NET source code analysis](https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview?WT.mc_id=DT-MVP-4015686)
    -   [Code-style naming rules](https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules?WT.mc_id=DT-MVP-4015686)
    -   [Code-style rule options](https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options?WT.mc_id=DT-MVP-4015686)
    -   [Roslyn's .editorconfig](https://github.com/dotnet/roslyn/blob/main/.editorconfig)
    -   [RhubarbVR\_Old's .editorconfig](https://github.com/RhubarbVR/RhubarbVR_Old/blob/main/.editorconfig)
-   [使用 Visual Studio 2022 可透過 .editorconfig 鎖定文字檔案的儲存編碼格式](/post/2024/06/07/Visual-Studio-2022-EditorConfig-UTF-8)
