升级至VS2022和.NET6后,Blazor Server作用域服务注册修正方法
问题分析与解决
核心问题
你的Program.cs代码存在逻辑错误:在启动宿主之后才进行服务注册,这导致后续的服务配置完全没有被应用。CreateHostBuilder(args).Build().Run();会阻塞当前线程,后面的var builder = WebApplication.CreateBuilder(args);及服务注册代码根本不会执行。
正确的服务注册方式(.NET6 Blazor Server)
.NET6采用了简化的WebApplication模型,你需要在构建宿主前完成服务注册,以下是两种正确写法:
方式一:使用顶层语句(.NET6默认模板推荐风格)
var builder = WebApplication.CreateBuilder(args); // 注册所有服务 builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddScoped<ConnectService>(); builder.Services.AddScoped<TagService>(); var app = builder.Build(); // 配置请求管道 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
方式二:保留Main方法的写法
如果坚持使用Main方法结构,需将服务注册放在宿主构建与启动之前:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 先完成服务注册 builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddScoped<ConnectService>(); builder.Services.AddScoped<TagService>(); // 再构建并运行宿主 var app = builder.Build(); // 配置请求管道 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run(); }
额外验证要点
- 确保
ConnectService和TagService类可正常实例化(无私有构造函数,依赖的其他服务已正确注册) - Razor页面的注入语法
@inject TagService TagService无需修改,服务注册正确后即可正常注入
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

