ASP.NET Core Web API 從 .NET 6 升級到 .NET 8

在 ASP.NET Core Web API 要從 .NET 6 升級到 .NET 8 非常簡單(不包含 Blazor),只需要三個步驟,如果有使用 docker 也只要四個步驟。

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

留言