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

.NET 8 Blazor发布后空白页且交互失效,依赖库加载失败

问题描述

我开发了一个采用**自动渲染模式(Server和WebAssembly)**的.NET 8应用,在Visual Studio中运行正常,但发布后或通过dotnet命令运行时仅显示空白页面,body内无任何元素加载。已确认安装了所有.NET 8运行时,且在不同机器测试均无效。

编辑补充:注释部分组件后UI可显示,但表现如同MVC应用,每次点击都会向服务器发送请求并返回完整页面,无交互性。进一步排查发现,发布后所有注入的库(如Blazored.Localstorage、Blazored.Modal、Localization)均无法正常工作,出现以下异常:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      渲染组件时发生未处理异常:Microsoft.Extensions.Localization.ResourceManagerStringLocalizer类型的VTable设置失败
System.TypeLoadException: Microsoft.Extensions.Localization.ResourceManagerStringLocalizer类型的VTable设置失败
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite , RuntimeResolverContext )
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSiteMain(ServiceCallSite , RuntimeResolverContext )
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite , RuntimeResolverContext )
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSite(ServiceCallSite callSite, RuntimeResolverContext argument)
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite , ServiceProviderEngineScope )
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeServiceProviderEngine.<>c__DisplayClass4_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier , ServiceProviderEngineScope )
   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type )
   在 Microsoft.AspNetCore.Components.ComponentFactory.<>c__DisplayClass9_0.<CreatePropertyInjector>g__Initialize|1(IServiceProvider serviceProvider, IComponent component)
   在 Microsoft.AspNetCore.Components.ComponentFactory.InstantiateComponent(IServiceProvider , Type , IComponentRenderMode , Nullable`1 )
   在 Microsoft.AspNetCore.Components.RenderTree.Renderer.InstantiateChildComponentOnFrame(RenderTreeFrame[] , Int32 , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& , Int32 , Int32 , Int32 , Int32 )
   在 Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer , RenderBatchBuilder , Int32 , ArrayRange`1 , ArrayRange`1 )
   在 Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder , RenderFragment , Exception& )
   在 Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry )
   在 Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
解决方案

1. 统一.NET 8 SDK与运行时版本

执行以下命令检查当前环境的SDK和运行时版本,确保开发与发布环境版本完全一致:

dotnet --version
dotnet --list-runtimes

若存在版本差异,升级到相同的.NET 8稳定版本后重新发布。

2. 修复本地化服务配置

ResourceManagerStringLocalizer的VTable异常源于本地化服务注册错误或资源文件未正确打包:

  • 在Program.cs中确认本地化服务注册正确:
    builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
    
  • 右键资源文件(如Resources/Shared.resx),设置复制到输出目录为“始终复制”,生成操作为“嵌入的资源”。

3. 更新Blazored库至.NET 8兼容版本

检查项目csproj文件中的Blazored包版本,确保使用支持.NET 8的最新版本,示例配置:

<PackageReference Include="Blazored.LocalStorage" Version="4.3.0" />
<PackageReference Include="Blazored.Modal" Version="6.1.0" />

更新后执行dotnet restore重新加载依赖。

4. 验证自动渲染模式配置

确保Server和Wasm组件都已正确启用:

  • 在Program.cs中添加自动渲染模式支持:
    builder.Services.AddRazorComponents()
        .AddInteractiveServerComponents()
        .AddInteractiveWebAssemblyComponents();
    
  • 检查App.razor中的路由组件,确保使用InteractiveAuto模式渲染页面(默认配置已包含,若手动修改需恢复)。
  • 发布时勾选“包含所有项目文件”,确保Wasm静态文件被正确打包。

5. 清理缓存后重新发布

删除项目的bin、obj目录及发布目标文件夹,执行以下命令重新发布:

dotnet clean
dotnet publish -c Release

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:25:54