将Blazor Server应用发布到Windows11 IIS时遇类型转换错误
解决方案
问题根源在于你的代码强制将WebRootFileProvider转换为CompositeFileProvider,但ASP.NET Core在不同环境下的默认文件提供者类型不同:
- 开发环境(Visual Studio运行):默认使用
CompositeFileProvider - IIS发布环境:默认使用
PhysicalFileProvider
这种类型不匹配导致了InvalidCastException,进而引发应用启动失败(HTTP 500.30)。
修改ConfigureStaticModuleFiles方法中的文件提供者初始化逻辑,兼容两种类型的文件提供者:
public static WebApplication ConfigureStaticModuleFiles(this WebApplication app) { var moduleManagerService = app.Services.GetService<ModuleManager>(); // 替换原来的强制转换逻辑,兼容不同类型的FileProvider List<IFileProvider> originalFileProviders; if (app.Environment.WebRootFileProvider is CompositeFileProvider compositeProvider) { originalFileProviders = compositeProvider.FileProviders.ToList(); } else { // 如果是PhysicalFileProvider或其他类型,直接加入列表 originalFileProviders = new List<IFileProvider> { app.Environment.WebRootFileProvider }; } StaticAssetInfo staticAssetInfo = new StaticAssetInfo(); foreach (IModulePackage modulePackage in moduleManagerService.Packages) { Assembly assembly = modulePackage.GetType().Assembly; var newPathProvider = new ManifestEmbeddedFileProvider(assembly, "wwwroot"); originalFileProviders.Add(newPathProvider); } app.Environment.WebRootFileProvider = new CompositeFileProvider(originalFileProviders.ToArray()); return app; }
逻辑说明
- 先判断当前
WebRootFileProvider的实际类型,避免强制转换的风险 - 如果是
CompositeFileProvider,则提取其内部的所有文件提供者列表 - 如果是其他类型(比如发布环境的
PhysicalFileProvider),则将当前提供者作为列表的第一个元素 - 后续添加模块的嵌入式文件提供者逻辑保持不变,最后统一封装为
CompositeFileProvider
修改后,开发环境和IIS发布环境都能正常加载静态资源,解决启动失败问题。
内容的提问来源于stack exchange,提问作者hdv212
相关产品推荐
相关产品推荐

