You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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;
}

逻辑说明

  1. 先判断当前WebRootFileProvider的实际类型,避免强制转换的风险
  2. 如果是CompositeFileProvider,则提取其内部的所有文件提供者列表
  3. 如果是其他类型(比如发布环境的PhysicalFileProvider),则将当前提供者作为列表的第一个元素
  4. 后续添加模块的嵌入式文件提供者逻辑保持不变,最后统一封装为CompositeFileProvider

修改后,开发环境和IIS发布环境都能正常加载静态资源,解决启动失败问题。

内容的提问来源于stack exchange,提问作者hdv212

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:23:10