預設 ASP.NET Core 連接埠已從 80 變更為 8080

在 .NET 容器映像中設定的預設 ASP.NET Core 連接埠已從 80 更新為 8080。

我們也新增 ASPNETCORE_HTTP_PORTS 環境變數,作為相較於 ASPNETCORE_URLS 而言更簡單的替代方案。 新的變數需要以分號分隔的連接埠號碼清單,而較舊的變數則使用較為複雜的語法。

使用舊版 WebHost.CreateDefaultBuilder() API 建置的應用程式不會遵守新的 ASPNETCORE_HTTP_PORTS 環境變數。 既然已不再自動設定 ASPNETCORE_URLS,它們會切換為使用預設 URL http://localhost:5000,而不是先前的 http://*:80

先前的行為

在 .NET 8 之前,您可以執行預期連接埠 80 為預設連接埠的容器,並能夠存取執行中的應用程式。

例如,執行下列命令可讓您在本機連接埠 8000 存取應用程式,此連接埠在容器中對應到連接埠 80:

docker run --rm -it -p 8000:80 <my-app>

新的行為

從 .NET 8 開始,若您在容器中對應到連接埠 80,而未明確地將容器中使用的 ASP.NET Core 連接埠設定為 80,則任何連線到該對應連接埠的嘗試都會失敗。

例如,若執行下列命令,您將「無法」使用連接埠 8000 在本機連線到應用程式。

docker run --rm -it -p 8000:80 <my-app>

改為將命令變更為在容器內使用連接埠 8080:

docker run --rm -it -p 8000:8080 <my-app>

您可以在下列範例中看到行為的差異。

對應連接埠 80 (失敗案例):

$ docker run --rm -d -p 8000:80 mcr.microsoft.com/dotnet/samples:aspnetapp
ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc
$ curl http://localhost:8000/Environment
curl: (56) Recv failure: Connection reset by peer
$ docker kill ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc
ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc

對應連接埠 8080

$ docker run --rm -d -p 8000:8080 mcr.microsoft.com/dotnet/samples:aspnetapp
74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d
$ curl http://localhost:8000/Environment
{"runtimeVersion":".NET 8.0.0-rc.1.23419.4","osVersion":"Alpine Linux v3.18","osArchitecture":"Arm64","user":"root","processorCount":4,"totalAvailableMemoryBytes":4123820032,"memoryLimit":0,"memoryUsage":30081024,"hostName":"74d866bdaa8a"}
$ docker kill 74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d
74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d

ASPNETCORE_HTTP_PORTS 設定為連接埠 80 的情況下對應連接埠 80

$ docker run --rm -d -p 8000:80 -e ASPNETCORE_HTTP_PORTS=80 mcr.microsoft.com/dotnet/samples:aspnetapp
3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09
$ curl http://localhost:8000/Environment
{"runtimeVersion":".NET 8.0.0-rc.1.23419.4","osVersion":"Alpine Linux v3.18","osArchitecture":"Arm64","user":"root","processorCount":4,"totalAvailableMemoryBytes":4123820032,"memoryLimit":0,"memoryUsage":95383552,"hostName":"3cc86b4b3ea1"}
$ docker kill 3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09
3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09

如果您使用 KubernetesDocker Compose,則必須根據那些結構描述變更連接埠。 如需範例,請參閱搭配 Kubernetes 使用 .NET (英文)。

導入的版本

.NET 8 Preview 1

變更類型

此變更為行為變更

變更原因

進行連接埠號碼變更是因為必須在切換至 non-root 使用者時提供良好的可用性體驗。 以使用者身分 non-root 執行需要在某些環境中使用非特殊權限連接埠。 由於連接埠 80 是特殊權限連接埠,因此預設連接埠已更新為連接埠 8080,這是非特殊權限連接埠。

有兩種方式可以回應此中斷性變更:

  • 建議:明確地將 ASPNETCORE_HTTP_PORTSASPNETCORE_HTTPS_PORTSASPNETCORE_URLS 環境變數設定為所需的連接埠。 範例: docker run --rm -it -p 9999:80 -e ASPNETCORE_HTTP_PORTS=80 <my-app>
  • 將仰賴預期之預設連接埠 80 的現有命令與設定更新為改為參考連接埠 8080。 範例: docker run --rm -it -p 9999:8080 <my-app>

若您的應用程式是使用較舊的 WebHost.CreateDefaultBuilder() 方法所建置,請設定 ASPNETCORE_URLS (而非 ASPNETCORE_HTTP_PORTS)。 範例: docker run --rm -it -p 9999:80 -e ASPNETCORE_URLS=http://*:80 <my-app>

受影響的 API

無。

另請參閱