Blazor部署至远程IIS遇500.30错误:无法加载程序集(本地正常)
你的情况核心是本地自包含部署正常,但共享IIS主机无法加载第三方程序集,结合日志和测试结果,问题大概率出在部署包完整性、服务器配置或权限上,以下是具体排查方向:
验证发布包完整性
本地执行dotnet publish -c Release -r win-x86 --self-contained true后,进入发布输出目录(默认是bin/Release/netX.X/win-x86/publish),确认所有第三方依赖dll(如Radzen.Blazor.dll、Serilog系列dll)都存在。然后对比服务器上的部署文件,检查是否有文件遗漏——共享主机FTP批量上传时偶尔会丢文件,建议将发布包打包成ZIP后上传,再在服务器端解压,避免单个文件传输错误。检查自包含发布配置
确认发布时未勾选Trim unused assemblies(程序集修剪),这个选项可能会误删第三方依赖的程序集;同时确认Target Runtime确实是win-x86,如果共享主机是64位系统,可以尝试发布win-x64版本测试,部分主机对32位程序的兼容性有限。确认服务器文件权限
共享IIS主机的应用池身份需要具备部署目录的读取权限。如果权限不足,ASP.NET Core进程无法读取dll文件,就会触发FileNotFoundException。可以联系主机提供商确认应用池身份的权限配置,或临时给部署目录添加Everyone的读取权限(测试用,后续再收紧权限)。排查第三方包的间接依赖
部分第三方组件存在间接依赖(比如Radzen.Blazor可能依赖Radzen.dll,Serilog可能依赖Serilog.Sinks.File等),本地开发时NuGet会自动下载,但发布时可能因配置问题未包含。可以用dotnet publish -v detailed查看发布日志,是否有依赖缺失的警告;或用ILSpy打开主程序集,查看其依赖项列表,对比服务器文件是否齐全。调整IIS应用池配置
自包含部署的应用,IIS应用池的**.NET CLR版本需设置为无托管代码**,避免与服务器上的.NET运行时冲突。同时确认应用池的Enable 32-Bit Applications选项与发布的目标架构匹配(win-x86则勾选,win-x64则取消)。检查部署路径合法性
确保服务器上的部署路径无特殊字符(如中文、空格、特殊符号),部分IIS环境对复杂路径的解析存在问题,会导致程序集加载失败。
示例错误日志:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'PACKAGE_NAME_HERE, Version=WHATEVER, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified. File name: 'Radzen.Blazor, Version=5.9.8.0, Culture=neutral, PublicKeyToken=null' at MyProject.com.Extensions.AddThirdPartyComponentsToServerExtension.AddThirdPartyComponentsToServer(IServiceCollection services) at Program.<Main>$(String[] args) in D:\Repos\MyProject\Program.cs:line 42
内容的提问来源于stack exchange,提问作者MRB

