Contents

第一次使用 Visual Studio 2022 創建 Net Core 專案和技術名詞小記

做為本篇 Net Core 第一篇筆記,這邊記錄Visual Studio 建立專案一些事情。

建置專案

https://user-images.githubusercontent.com/6058558/204532432-2c96e38b-eac9-4f7e-9ec7-527eb6a49e45.png

這邊修改方案、專案名稱。這邊要注意,1個方案可以有很多專案。每一個專案下面只有一個 Program.cs 程式,這邊我目前得知預設好像沒有像 Java 一樣可以設定很多 main 方法。
https://user-images.githubusercontent.com/6058558/204532729-5ba88c62-faa6-42fe-80bc-bed5164b2f0b.png

這邊可以針對設定做調整。

https://user-images.githubusercontent.com/6058558/204533409-f98f5e00-0133-4898-8c34-3a2ae9bbdd7c.png

https://user-images.githubusercontent.com/6058558/204535951-c425da2d-86a1-4b07-b69d-708fee04b202.png

一些知識

.csproj

.csproj 是根據程式語言的設定檔所使用。一開始接副檔名還滿長的,但其實就是csproject縮寫。

Note
C# 副檔名是 cs

在專案右鍵點點選編輯專案檔或點專案兩下也可以進去修改文件。
https://i.imgur.com/LDlNzCC.png

這邊我在後期研究發現這個跟專案有關係,當沒有這個的話,Visual Studio 無法讀到這區程式路徑。

發現原因
我之前使用 OpenAPI 產生 Code,發現沒有 csproj 是沒辦法用 Visual Studio 打開的,後來我發現我用到廢棄的 Code Generate,所以才沒正常產生出來…

我後來更深入了解這個跟 MS Build 有關係,有空再升入研究。

針對 csproj 檔案

TargetFramework

在應用程式中指定你的目標框架(TargetFramework)。
指定目標版本需要用TargetFrameworkMoniker(TFM)。

AspNetCoreHostingModel

指定應用程式的託管形式。
有兩種:

  1. InProcess
  2. OutOfProcess

ASP.NET Core 預設採用InProcess託管。
https://i.imgur.com/G072UUj.png
最新版我看文件好像採用OutOfProcess,詳細使用 IIS 和 ASP.NET Core 進行跨進程裝載 | Microsoft Docs文章。
https://i.imgur.com/OC9tr4A.png

也可以看老 ASP.NET Core 程式的 IIS InProcess 模式設定問題-黑暗執行緒

InProcess

InProcess 是指 ISS 程式(w3wp.exe)中託管我們的 ASP.NET Core應用程式。

OutOfProcess

Web請求轉發到後端 ASP.NET Core 中,而整個應用程式運行在 ASP.NET Core 中內置的 Kestrel 中。

PackageReference

https://i.imgur.com/K07OfrK.png

用於包含對應應用程式安裝的 nuget 包的引用。
Metapackage(綜合包) - Microsoft.AspNetCore.App
Metapackage 本身沒有任何內容。

Microsoft.AspNetCore.App 不需要指版本。

Main (Web)主程式撰寫

Program.cs => Startup.cs

重點有兩個設定。

  1. 註冊 DI
    https://i.imgur.com/YkzKamb.png

  2. 設定 Middleware 地方
    https://i.imgur.com/flZmkdk.png

這邊先不細談。

CreateDefaultBuilder() 執行的一些任務

  • 設置 Web 服務器
  • 加載主機和應用程式配置表訊息
  • 配置日誌(log)記錄

Hello world 測試

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello world!");
            });
        }

WriteAsync 未定義

.net core WriteAsync 方法未定义_已解决_博问_博客园
c# - How to print process name in StartUp.cs for .net core 3.1 - Stack Overflow

程式碼上面加下面這段就可以了。

1
using Microsoft.AspNetCore.Http;

不過還滿迷的,有空來研究為什麼。

InProcess 託管

1
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

InProcess 是指 ISS 程式(w3wp.exe or iisexpress.exe)中託管我們的 ASP.NET Core 應用程式。

InProcessOuOfProcess 託管提供了更高的吞吐量。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.Run(async (context) =>
            {
                var processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
                await context.Response.WriteAsync(processName);
            });
        }

可以選擇別的託管

https://i.imgur.com/mzUbTna.png

Process.ProcessName Property (System.Diagnostics) | Microsoft Docs

OutOfProcess

有2個 Web 服務器 - 內部 Web 服務器和外部 Web 服務器。

  1. 內部 Web 服務器是 Kestrel。
  2. 外部 Web 服務器呵以是ISS,Nginx或Apache。

什麼是 Kestrel Web Server?

Kestrel 是ASP.NET Core 的跟平台WEB服務器
Kestrel本身可以用作邊綠服務器
Kestrel 中用於託管應用程式的進程是dotnet.exe

可參考:

https://i.imgur.com/pjH5M7U.png

預設 Port

ISS: 3290
DOTNET: 5000

LaunchSetting.json

在 Properties 底下設定。

https://i.imgur.com/g90UcaQ.png

https://i.imgur.com/oRp5sOR.png

原始碼參考

環境變數

ASP.NET Core 中的設定來源:

  • appsettings.json,appsettings.Environment.json 不同環境下對應不同的主機環境
  • User Secrets(用戶機密)
  • Environment variables
  • Command line arguments(命令參數)

以上配置順序,後會蓋前。

appSettings.json

可以依照還境變數ASPNETCORE_ENVIRONMENT來改變裡面設定的值。

1
2
3
4
5
6
7
8
9
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

User Secrets

https://i.imgur.com/5ucxDMT.png

設定環境變數

https://i.imgur.com/3eG2hvE.png

https://i.imgur.com/2Qslz9w.png

ASPNETCORE_ENVIRONMENT=Development這邊設定可以看出會指定 ASPNETCORE_ENVIRONMENT 環境變數套用在 ASP.NET Core 上面。

command line argument

1
dotnet run CustomText "Hello World in command line argument"