发布集成Blazor WASM的ASP.NET Core Web API时AOT运行时错误
Blazor WebAssembly AOT编译后IIS Express无法加载模块问题解决
问题概述
在.NET 8环境下,基于ASP.NET Core Web API托管Blazor WebAssembly项目,为Blazor WASM启用Release模式的AOT编译后,通过IIS Express运行发布产物时,应用因无法加载必要的AOT模块启动失败;但使用dotnet-serve运行相同发布文件却能正常工作。最终改用dotnet publish命令发布解决了问题。
原因分析
这类问题通常源于自定义发布配置文件(.pubxml)未完整包含AOT编译生成的Native模块及配套加载脚本,或者IIS Express的静态文件处理规则未正确映射AOT相关文件类型(如.wasm、特定JS模块)。而dotnet publish命令会自动处理Blazor WASM的AOT编译产物,确保所有必要文件(Native模块、框架依赖、静态资源等)被完整打包到输出目录。
解决方案
直接使用
dotnet publish命令发布
放弃自定义发布配置文件,执行以下命令完成Release模式发布:dotnet publish -c Release该命令会自动处理AOT编译产物的收集与打包,确保部署文件完整性。
若需保留发布配置文件,添加必要配置
如果必须使用.pubxml发布,需在配置文件中添加以下节点,保证AOT相关文件被正确包含:<PropertyGroup> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <CopyBlazorWebAssemblyFilesToPublishDirectory>true</CopyBlazorWebAssemblyFilesToPublishDirectory> </PropertyGroup>
相关项目代码验证
Web API Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped<IPasswordHasher<User>, UserPasswordHasher>(); builder.Services.AddIdentityCore<User>().AddUserStore<UserStore>().AddApiEndpoints(); builder.Services.AddRazorPages(); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.MapIdentityApi<User>(); app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseRouting(); app.MapRazorPages(); app.MapControllers(); app.MapFallbackToFile("index.html"); app.Run();
WebAPI.csproj
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Geralt" Version="3.1.0" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10"/> <PackageReference Include="MongoDB.Driver" Version="3.0.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/> </ItemGroup> <ItemGroup> <ProjectReference Include="..\WebApp\WebApp.csproj" /> </ItemGroup> </Project>
WebApp.csproj
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <RunAOTCompilation>true</RunAOTCompilation> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.10" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.10" PrivateAssets="all" /> </ItemGroup> </Project>
内容的提问来源于stack exchange,提问作者Wilco Bakker
相关产品推荐
相关产品推荐

