.NET 6 Azure App Service部署遇System.Text.Json加载异常求助
核心原因
你遇到的System.IO.FileLoadException本质是依赖版本不匹配:本地开发环境中项目引用的是System.Text.Json 6.0.4,但部署到Azure App Service后,运行时尝试加载框架自带的6.0.0.0版本,导致清单定义不匹配。
针对你的疑问解答
是否是绑定重定向问题?
.NET 5+(包括.NET 6)不再使用传统.NET Framework的绑定重定向机制,而是通过运行时依赖解析策略处理版本问题。但这个场景下的版本冲突可以通过版本强制配置解决,本质是依赖解析逻辑问题,而非传统绑定重定向。发布到Azure时是否需要显式包含某些程序集?
是的。当你引用了比.NET 6框架自带版本更高的System.Text.Json包时,必须确保该程序集及其依赖被打包到发布目录中,避免Azure运行时使用自带的旧版本。GitHub Actions配置中是否有遗漏的内容?
有可能。需要确认构建/发布步骤是否正确处理了依赖,比如是否完整还原NuGet包、是否正确生成包含所有依赖的发布输出。
具体解决方案
1. 强制复制依赖到发布目录
在.csproj文件中添加以下配置,确保所有NuGet依赖都被复制到发布输出:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
该配置会强制将lock.json中记录的所有依赖程序集复制到输出目录,避免依赖Azure运行时的系统版本。
2. 配置运行时版本绑定
在项目根目录创建runtimeconfig.template.json文件,添加以下内容,强制指定System.Text.Json的版本:
{ "dependencies": { "System.Text.Json": { "version": "6.0.4" } } }
发布时,这个配置会被合并到生成的.runtimeconfig.json中,告诉运行时优先使用指定版本的程序集。
3. 检查GitHub Actions的发布命令
确保你的GitHub Actions workflow中的构建/发布步骤正确,示例如下:
jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup .NET 6 uses: actions/setup-dotnet@v4 with: dotnet-version: '6.x' - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - name: Publish run: dotnet publish --configuration Release --no-build --output ./publish - name: Deploy to Azure App Service uses: azure/webapps-deploy@v3 with: app-name: 'your-app-name' slot-name: 'production' publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} package: ./publish
重点确保:
- 使用了正确的.NET 6 SDK版本
dotnet publish命令生成了完整的发布输出- 部署步骤正确指向
./publish目录
4. 清理Azure App Service的残留文件
旧的部署文件可能导致版本冲突,可通过Kudu工具清理:
- 登录Azure门户,进入你的App Service
- 点击左侧菜单「高级工具」→「Go」打开Kudu
- 进入「Debug console」→「CMD」
- 删除
site/wwwroot下的所有文件:rmdir /s /q wwwroot - 重新执行GitHub Actions部署
5. 统一解决方案内的NuGet版本
如果项目是解决方案的一部分,确保所有项目引用的System.Text.Json版本一致,避免跨项目版本冲突。
内容的提问来源于stack exchange,提问作者user30691755

