在 ASP.NET Core Web API 要從 .NET 6 升級到 .NET 8 非常簡單(不包含 Blazor),只需要三個步驟,如果有使用 docker 也只要四個步驟。
1. 更新 global.json 指定的 dotnet 版本為 8.0.0
2. 更新專案 .csproj 檔案的目標框架版本:
3. 更新套件將所有 Microsoft.AspNetCore.*、Microsoft.EntityFrameworkCore.*、Microsoft.Extensions.* 和 System.Net.Http.Json 套件都更新到 8.0.0 或其他 8 開頭的最新版本。
4. 更新 Dockerfile ,將 aspnet 和 sdk 的版本變更為 8.0,另外因為 docker 預設的連接埠從 80 變成 8080 ,所以也需要變更為 EXPOSE 8080 。
這樣就更新完畢了!目前筆者還沒有遇到需要調整的語法。
筆者的連接字串如下:
經過一番 google ,找到的解決方式是把 Dockerfile 內的 dotnet/aspnet:8.0 和 dotnet/sdk:8.0 替換為 aspnet:8.0-jammy 和 sdk:8.0-jammy 即可
參考資料:
Microsoft.Learn - Migrate from ASP.NET Core 6.0 to 7.0
Microsoft.Learn - Migrate from ASP.NET Core in .NET 7 to .NET 8
GitHub - dotnet/SqlClient Issues dotnet 8: Error Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed) #2252
1. 更新 global.json 指定的 dotnet 版本為 8.0.0
{
"sdk": {
"version": "8.0.0",
"rollForward": "latestMajor",
"allowPrerelease": true
}
}
2. 更新專案 .csproj 檔案的目標框架版本:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
</Project>
3. 更新套件將所有 Microsoft.AspNetCore.*、Microsoft.EntityFrameworkCore.*、Microsoft.Extensions.* 和 System.Net.Http.Json 套件都更新到 8.0.0 或其他 8 開頭的最新版本。
4. 更新 Dockerfile ,將 aspnet 和 sdk 的版本變更為 8.0,另外因為 docker 預設的連接埠從 80 變成 8080 ,所以也需要變更為 EXPOSE 8080 。
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["WebApplicationTest0727/WebApplicationTest0727.csproj", "WebApplicationTest0727/"]
RUN dotnet restore "WebApplicationTest0727/WebApplicationTest0727.csproj"
COPY . .
WORKDIR "/src/WebApplicationTest0727"
RUN dotnet build "WebApplicationTest0727.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "WebApplicationTest0727.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplicationTest0727.dll"]
這樣就更新完畢了!目前筆者還沒有遇到需要調整的語法。
docker 無法連接資料庫問題
筆者更新到 .NET 8 後在執行專案時沒有遇到問題,但是部署到 docker 時連接 SQL Server 資料庫出現錯誤:
Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed)
筆者的連接字串如下:
Server=192.168.0.2,1433;Database=mydb;User=myuser;Password=mypwd;Trusted_Connection=False;Encrypt=True;TrustServerCertificate=true;
經過一番 google ,找到的解決方式是把 Dockerfile 內的 dotnet/aspnet:8.0 和 dotnet/sdk:8.0 替換為 aspnet:8.0-jammy 和 sdk:8.0-jammy 即可
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["WebApplicationTest0727/WebApplicationTest0727.csproj", "WebApplicationTest0727/"]
RUN dotnet restore "WebApplicationTest0727/WebApplicationTest0727.csproj"
COPY . .
WORKDIR "/src/WebApplicationTest0727"
RUN dotnet build "WebApplicationTest0727.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "WebApplicationTest0727.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplicationTest0727.dll"]
參考資料:
Microsoft.Learn - Migrate from ASP.NET Core 6.0 to 7.0
Microsoft.Learn - Migrate from ASP.NET Core in .NET 7 to .NET 8
GitHub - dotnet/SqlClient Issues dotnet 8: Error Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed) #2252
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com