Linux Kestrel服务器无法加载Blazored.LocalStorage程序集求助
Blazored.LocalStorage在Ubuntu 20.04 LTS加载失败,Ubuntu 22.04可正常运行
问题详情
Blazor Web服务在Windows开发环境运行正常,此前在Ubuntu 20.04 LTS的Kestrel上稳定运行9个月,多次更新都没问题,但本次部署后启动报错:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Blazored.LocalStorage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c577f5cf869402a'. The system cannot find the file specified.
File name: 'Blazored.LocalStorage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c577f5cf869402a'
Aborted (core dumped)
已确认:
- Blazored.LocalStorage.dll确实在部署包内
- 用命令
strings Blazored.LocalStorage.dll | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'验证过版本是1.0.0.0 - 所有文件权限、所有者一致,唯独这个DLL加载失败
试过以下操作都没用:
- 回滚到之前能正常运行的旧版本部署
- 执行
apt-get update && apt-get upgrade并重启服务器 - 配置.NET和Kestrel环境变量后直接在Shell启动
唯一差异:部署包放到Ubuntu 22.04服务器上能正常运行,两台服务器仅系统版本不同。
原因分析
核心是Ubuntu 20.04和22.04的系统依赖库差异导致,具体可能是这几点:
- libssl版本不兼容:Ubuntu 20.04默认用libssl1.1,22.04用libssl3,.NET运行时加载程序集时对SSL库的依赖版本不匹配,间接引发Blazored.LocalStorage加载失败
- 系统基础库版本差异:Ubuntu 20.04的glibc等基础库版本比22.04低,部分.NET程序集的绑定逻辑在旧库环境下出现异常
- 程序集绑定重定向失效:部署包中的
runtimeconfig.json或*.deps.json里的绑定配置,在Ubuntu 20.04的.NET环境下没正确生效,导致版本匹配出错
解决方法
方法1:升级Ubuntu 20.04的libssl到3.0版本
- 添加openssl 3的PPA源:
sudo add-apt-repository ppa:openssl-team/openssl-3 sudo apt-get update - 安装libssl3:
sudo apt-get install libssl3 - 重启Kestrel服务后测试
方法2:修复程序集绑定配置
- 打开部署包中的
[你的项目名].deps.json,搜索Blazored.LocalStorage,确认所有引用该程序集的条目都指向1.0.0.0版本 - 如果有版本不一致的条目,手动修正后重新部署
- 也可以在项目的
.csproj文件中添加强制绑定重定向配置,重新编译部署:<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
方法3:更新Ubuntu 20.04的.NET运行时到最新兼容版本
- 先卸载当前的.NET运行时/SDK:
sudo apt-get remove dotnet-sdk-* dotnet-runtime-* - 安装对应版本的最新.NET运行时(比如项目用.NET 6):
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo apt-get install dotnet-runtime-6.0 - 重启服务测试
方法4:改用自包含部署模式
把项目编译成自包含包,包含所有依赖的.NET运行时和系统库,不依赖服务器上的系统库:
- 在项目目录执行编译命令:
dotnet publish -c Release -r linux-x64 --self-contained true - 把生成的
publish目录下的所有文件部署到Ubuntu 20.04,直接启动可执行文件即可
内容的提问来源于stack exchange,提问作者Jay Imerman
相关产品推荐
相关产品推荐

