You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 8.0 Linux部署启动失败:缺失System.Text.Json 9.0.0.0程序集

ASP.NET Core 8.0 Linux部署启动失败:缺失System.Text.Json 9.0.0.0程序集

我之前也碰到过类似的跨.NET版本依赖冲突问题,结合你的报错栈和场景,这明显是依赖版本不匹配导致的——你的.NET 8.0项目里有组件在尝试加载.NET 9.0专属的System.Text.Json 9.0.0.0程序集,但Linux服务器上只有.NET 8.0 Runtime,自然找不到对应的文件。下面是我亲测有效的排查和解决步骤:


1. 锁死NuGet依赖的.NET 8.0兼容版本

从你提到的「集中管理NuGet版本」操作来看,大概率是统一版本时不小心把System.Text.Json或相关依赖(比如Serilog的包)指定成了.NET 9.x版本:

  • 打开你的集中版本管理文件(比如Directory.Packages.props),搜索System.Text.Json,把版本改成.NET 8.0对应的稳定版,比如8.0.4(对应.NET 8的最新补丁版本),示例配置:
    <PackageVersion Include="System.Text.Json" Version="8.0.4" />
    
  • 同时检查Serilog相关包(比如Serilog.Settings.ConfigurationSerilog.Extensions.Hosting),这些包的版本必须和.NET 8.0兼容,别安装成9.x版本——从报错栈能看到,是Serilog在加载依赖上下文时触发的问题。

2. 清理+强制还原+重新发布

本地先彻底清理旧的依赖和编译产物,避免残留错误版本的文件:

  • 执行清理命令:
    dotnet clean
    
  • 强制重新还原依赖(跳过本地缓存,拉取正确版本):
    dotnet restore --force
    
  • 发布时明确指定目标框架为net8.0,如果部署到Linux x64服务器,还可以指定Runtime标识符确保打包兼容:
    dotnet publish -c Release -f net8.0 -r linux-x64 --self-contained false -o ./publish
    
    (如果用--self-contained true,会把所有依赖包括.NET Runtime一起打包,能彻底避免服务器上的Runtime版本问题,但包体积会大一些)

3. 检查Linux服务器的.NET Runtime环境

登录Linux服务器,确认Runtime版本是否正确:

  • 查看已安装的Runtime:
    dotnet --list-runtimes
    
    确保Microsoft.AspNetCore.App 8.xMicrosoft.NETCore.App 8.x存在,如果只有.NET 9的Runtime,就会出现版本不兼容的问题。
  • 如果服务器上同时装了.NET 8和9的Runtime,可以通过设置环境变量强制应用使用.NET 8:
    在启动你的Kestrel服务的脚本里,加上:
    export DOTNET_ROLL_FORWARD=LatestMinor
    export DOTNET_ROOT=/usr/share/dotnet/dotnet-8.0.x
    
    再启动你的应用程序。

4. 验证发布包的依赖文件

如果上面的步骤还没解决,可以打开发布目录里的MyWebApp.deps.json,搜索System.Text.Json,看看是否存在9.0.0.0的版本条目:

  • 如果有,说明本地打包时就带了错误的依赖引用,回到第一步重新检查Directory.Packages.props和项目的NuGet引用,确保所有依赖都和.NET 8.0对齐。

按照这个流程排查下来,基本就能解决这个版本冲突问题。核心就是确保整个解决方案的依赖版本和目标框架(.NET 8.0)完全匹配,避免不小心引入高版本.NET的专属包。

火山引擎 最新活动