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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:15:18