如何在Blazor项目中调用Razor类库(RCL)内定义的Controller接口
问题根因
你遇到的报错本质是HttpClient实例配置错误导致,和控制器定义、端点映射没有直接关联:手动实例化的HttpClient没有设置请求基准地址,无法完成相对路径的地址解析。
解决方案
按以下步骤调整即可:
- 调整HttpClient的使用方式
不要手动new HttpClient,Blazor应用支持直接注入已经配置好基准地址的HttpClient实例:
首先在Razor组件顶部添加注入声明:
@inject HttpClient Http @* 如果是Blazor Server还需要注入NavigationManager辅助配置,WebAssembly可忽略 *@ @inject NavigationManager NavManager
接口调用代码修改为:
string uri = $"Data/LetsBreakIt"; try { ssiList = await Http.GetFromJsonAsync<List<string>>(uri); } catch (Exception ex) { // 自行补充异常处理逻辑 }
如果注入时提示HttpClient服务未注册,在主项目Startup.cs的ConfigureServices方法中补充注册逻辑:
// Blazor WebAssembly 直接添加即可 services.AddHttpClient(); // Blazor Server 需要额外指定BaseAddress services.AddScoped<HttpClient>(sp => { var navManager = sp.GetRequiredService<NavigationManager>(); return new HttpClient { BaseAddress = new Uri(navManager.BaseUri) }; });
- 确保RCL控制器被主项目扫描
如果调整HttpClient后调用返回404,说明主项目未识别到RCL中定义的控制器,需要补充程序集扫描配置,修改ConfigureServices中的控制器注册代码:
services.AddControllers() // 替换DataController为你RCL内定义的控制器类型,用于指定扫描的程序集 .AddApplicationPart(typeof(DataController).Assembly);
你现有的端点映射配置已经包含endpoints.MapControllers(),无需额外修改。
- 控制器有效性验证
你可以直接在浏览器地址栏输入{你的应用访问根地址}/Data/LetsBreakIt,如果能正常返回JSON数据,说明控制器的路由、注册逻辑均正常,仅需要调整前端调用逻辑即可。
内容的提问来源于stack exchange,提问作者Eagle
相关产品推荐
相关产品推荐

