ASP.NET Core Blazor WASM 自定义服务未注册报错排查
问题根因与修复方案
核心报错是DI服务注册写法错误,另外代码中还有3处会导致后续运行异常的问题,按以下步骤修正即可:
- 服务注册逻辑错误:你调用的
AddHttpClient<IAccountService>()仅传入了接口类型,DI容器无法仅凭接口完成实例化,自然无法找到对应服务的实现。 - HTTP请求路径错误:
AccountService的GetUser方法未将传入的id参数拼到请求地址中,会导致接口404或返回空值。 - 服务端数据存储逻辑错误:
AccountController中的用户集合是实例私有字段,每次请求都会新建Controller实例重置数据,新增、删除接口实际不会持久化生效。
1. 修正客户端服务注册
打开Client项目的Program.cs,替换HttpClient注册代码,托管模式下直接配置好接口基地址,避免后续路径拼接错误:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages(); // 同时指定服务接口与实现类,配置接口基地址 builder.Services.AddHttpClient<IAccountService, AccountService>(client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress + "api/"); }); var app = builder.Build();
2. 修正AccountService请求逻辑
补全GetUser方法的路径参数,匹配服务端路由规则:
public class AccountService : IAccountService { private readonly HttpClient _http; public AccountService(HttpClient http) { _http = http; } public async Task<User> GetUser(int id) { // 拼接id参数,基地址已包含api/前缀,直接写控制器路由+参数即可 return await _http.GetFromJsonAsync<User>($"Account/{id}"); } } public interface IAccountService { Task<User> GetUser(int id); }
3. 修正服务端Controller数据存储问题
测试阶段将用户集合改为静态,保证所有请求共享同一份数据,正式项目请替换为数据库存储,同时补全新增、删除接口的基础逻辑:
[Route("api/[controller]")] [ApiController] public class AccountController : ControllerBase { // 改为静态集合,避免每次请求重置数据 private static readonly List<User> _users = new List<User>() { new User() { Name= "Nico", Id = 0 } }; [HttpGet("{id}")] public User? GetUser(int id) { return _users.FirstOrDefault(x => x.Id == id); } [HttpPost] public IActionResult RegisterUser([FromBody] User user) { user.Id = _users.Max(u => u.Id) + 1; _users.Add(user); return Ok(); } [HttpDelete("{id}")] public IActionResult DeleteUser(int id) { var target = _users.FirstOrDefault(x => x.Id == id); if (target == null) return NotFound(); _users.Remove(target); return Ok(); } }
修正完成后重新编译运行,服务注入报错会直接消失,接口调用也能正常返回数据。
内容的提问来源于stack exchange,提问作者Nico Walsemann
相关产品推荐
相关产品推荐

