ASP.NET Core設定URLs的幾種方法

GIS學習班發表於2021-11-09

前言

在使用ASP.NET Core 3.1開發時,需要配置伺服器監聽的埠和協議,官方幫助文件進行簡單說明,文件中提到了4種指定URL的方法

  1. 設定ASPNETCORE_URLS 環境變數;
  2. 使用dotnet --urls 命令列引數;
  3. 使用urls作為鍵進行配置;
  4. 使用UseUrls擴充套件方法;

為便於講清楚URLs設定方法,建立名為AspNetCoreUrl的ASP.NET Core Web API程式進行說明,預設情況下,啟動ASP.NET Core後,監聽以下URLs:

http://localhost:5000/

https://localhost:5001/

URL格式

主要有三種URL格式表達方式,可以檢視官方文件(https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#url-prefixes)

格式1:{scheme}://{loopbackAddress}:{port},例如http://localhost:5000/https://localhost:5001/

格式2:{scheme}://{IPAddress}:{port},例如http://127.0.0.1:5000/https://192.168.1.100:5001/

格式3:{scheme}://*:{port},例如http://*:5000/https://domain.com:5001/

前提條件

在開始測試幾種URLs設定方法前,需要先生成AspNetCoreUrl程式,然後在生成的根目錄下開啟命令列工具進行相應的測試

image

如圖,我這裡的程式根目錄為D:\AspNetCoreUrl\AspNetCoreUrl\bin\Debug\netcoreapp3.1,使用的終端為微軟官方的Windows PowerShell

方法1 使用環境變數

在不修改AspNetCoreUrl任何原始碼的情況下(即建立專案時的程式預設狀態)生成程式,定位到生成的根目錄下,開啟命令列終端

image

# 環境變數僅在當前命令列視窗生效
$Env:ASPNETCORE_URLS = "http://localhost:7000;https://localhost:7010"
# 或者使用DOTNET_URLS環境變數同樣可生效
$Env:DOTNET_URLS = "http://localhost:8000;https://localhost:8010"
# 執行AspNetCoreUrl程式
dotnet AspNetCoreUrl.dll

如果使用Windows命令列(即cmd命令列),使用下面的方式設定

# 環境變數僅在當前命令列視窗生效
set ASPNETCORE_URLS=http://localhost:7000;https://localhost:7010
# 將ASPNETCORE_URLS變數儲存到使用者環境變數中
setx ASPNETCORE_URLS "http://localhost:7000;https://localhost:7010"
# 加/m引數,將ASPNETCORE_URLS變數儲存到系統環境變數中
setx ASPNETCORE_URLS "http://localhost:7000;https://localhost:7010" /m
# 執行AspNetCoreUrl程式
dotnet AspNetCoreUrl.dll

注意:使用setx設定環境變數後,需要開啟新的Windows命令列視窗才會使用環境變數生效

在Linux系統中使用以下命令設定環境變數

# 環境變數僅在當前終端生效,關閉終端後需要重新設定
export ASPNETCORE_URLS="http://localhost:7000;https://localhost:7010"

方法2 使用命令列引數

在生成程式的根目錄下,使用dotnet --urls命令,並帶上urls引數

dotnet AspNetCoreUrl.dll --urls "http://localhost:7001;https://localhost:7011"

image

方法3 使用配置檔案

在生成程式的根目錄下,開啟appsettings.json檔案,新增url配置項,然後雙擊AspNetCoreUrl.exe執行

{
    "urls":"http://localhost:7002;http://localhost:7012"
}

image

執行結果如下圖

image

方法4 使用UseUrls

這種方法需要修改原始碼,開啟Program.cs檔案,修改CreateHostBuilder方法內容,主要是新增UseUrls擴充套件方法然後生成程式。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            // 使用UseUrls設定監聽的埠和協議
            webBuilder.UseUrls("http://localhost:7003", "https://localhost:7013");
        });

image

注意:執行前需要將appsettings.json檔案恢復到預設狀態,即沒有配置urls的狀態,否則配置檔案中設定會覆蓋程式碼中的方法。

方法5 使用Kestrel

這種方法並不在官方文件中,因為該方法僅限於使用Kestrel的時候生效,在建立ASP.NET Core應用程式時,預設使用Kestrel來託管應用,使用這種方法也有相應的應用場景,這裡簡單介紹下該方法的使用

開啟Program.cs檔案,修改CreateHostBuilder方法內容

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            // 配置Kestrel服務
            webBuilder.UseKestrel(kestrelServerOptions =>
            {
                kestrelServerOptions.ListenLocalhost(7004);
                kestrelServerOptions.ListenLocalhost(7014, listenOptions => listenOptions.UseHttps());
            });
        });

image

優先順序

前面介紹的5種方法都在獨立執行,如果將這5種方法同時用上,會有什麼樣的效果呢,下面來測試下,為了便於測試,每種方法都使用了不同的埠進行區分,下面顯示了使用全部方法的執行結果:

image

可以看到,生效的是使用Kestrel方法,現在將Kestrel這種註釋掉,執行結果如下:

image

可以看到此時生效的是使用命令列引數方法,如果不使用命令列引數方法,執行結果如下:

image

生效的是配置檔案中的設定,現在刪除配置檔案中urls的配置,執行結果如下:

image

生效的是UseUrls擴充套件方法,現在註釋掉UseUrls方法程式碼,執行結果如下:

image

生效的是環境變數,如果不設定環境變數,則使用預設值,即http://localhost:5000/https://localhost:5001/

總結

本文介紹了ASP.NET Core幾種常用的設定URLs的方法,大家可以根據專案實際情況選擇其中一種或幾種,如果同時使用幾種URLs設定方法,則需要留意配置的優先順序問題,經過測試得出
Kestrel > 命令列 > 配置檔案 > UseUrls > 環境變數 > 預設值

如果你想自己試一試,程式碼地址:
gitee:https://gitee.com/gyhgis/AspNetCoreUrl
github:https://github.com/gyhgis/AspNetCoreUrl

相關文章