文章目錄
ASP.NET Core URLs 設定的套用順序
最近負責的專案需要為多個 ASP.NET Core 專案指定統一的對外 url (主要是 port),所以花了點時間好好釐清幾個設定方式的優先順序,為了避免下次又要重新回憶,筆記一下
基本環境說明
- macOS Big Sur 11.5.1
- .NET Core SDK 5.0.202
- ASP.NET Core Web Api 預設專案範本
套用順序
驗證方式是逐一加上下列設定,可以發現後者會覆蓋前者設定值
預設值:
http://localhost:5000;https://localhost:5001
launchSettings.json 中的
applicationUrl
{ "profiles": { "KestrelEndpointsDemo": { "applicationUrl": "https://localhost:6001;http://localhost:6000" } } }
environment
ASPNETCORE_URLS
environment 設定方式很多種,以下示範使用 launchSettings.json
{ "profiles": { "KestrelEndpointsDemo": { "applicationUrl": "https://localhost:6001;http://localhost:6000", "environmentVariables":{ "ASPNETCORE_URLS": "https://localhost:7001;http://localhost:7000" } } } }
WebHostBuilder 的
UseUrls
Program.cs 中的 CreateHostBuilder 方法
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.UseUrls("http://localhost:8000", "https://localhost:8001"); });
dotnet run 參數
--urls
dotnet run --urls http://localhost:9000;https://localhost:9001 KestrelEndpointsDemo.dll
WebHostBuilder 的
UseKestrel
Program.cs 中的 CreateHostBuilder 方法
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseKestrel(opts => { opts.ListenLocalhost(10000, opts =>opts.Protocols= HttpProtocols.Http1); opts.ListenLocalhost(10001, opts => opts.UseHttps()); }); // UseUrls 相關設定會被 UseKestrel 覆蓋 webBuilder.UseUrls("http://localhost:8000", "https://localhost:8001"); });
appsettings.json 的
Kestrel:Endpoints:Http:Url
與Kestrel:Endpoints:Https:Url
這個設定很特別,不會覆蓋先前的任何設定,而是強制 application 依設定值加開監聽 url
{ "Kestrel": { "Endpoints": { "Http": { "Url": "http://localhost:20000" }, "Https": { "Url": "https://localhost:20001" } } } }
心得
過去印象一直停留在官網的說明 Microsoft Docs:設定 ASP.NET Core Kestrel web 伺服器的端點 中,偶然之間看到 Andrew Lock 的 5 ways to set the URLs for an ASP.NET Core app 主要是針對 ASP.NET Core 1.0,所以興起了確認 .NET 5 的行為是否一致的想法,不確定是微軟調整了實作方式還是 macOS 行為不同,但目前測試起來是跟 官網說明 與 Andrew Lock 文章提到的略有不同
完整程式碼請參考:yowko/KestrelEndpointsDemo
參考資訊
文章作者 Yowko Tsai
上次更新 2021-08-17
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。