.NET Core 3.0中Blazor Server调用MVC Controller API失败求助
解决Blazor Server无法读取MVC Controller API数据的问题
我仔细看了你的代码,发现几个关键问题,咱们一步步来排查修复:
1. 中间件配置顺序冲突
你的Startup.cs里同时使用了UseMvcWithDefaultRoute()和UseEndpoints(),这在ASP.NET Core 3.0+版本里会导致路由逻辑冲突——UseMvcWithDefaultRoute会直接终结路由流程,让后面的MapControllers、MapBlazorHub等端点映射无法正常工作。
修复方案:
直接移除app.UseMvcWithDefaultRoute();,因为你已经在UseEndpoints里配置了MapControllers(),完全可以处理API路由。修改后的Configure方法如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 删掉这行,避免路由冲突 // app.UseMvcWithDefaultRoute(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 处理API路由 endpoints.MapBlazorHub(); // Blazor SignalR 连接 endpoints.MapFallbackToPage("/_Host"); // Blazor 入口页 }); }
2. HttpClient使用方式错误
在Blazor Server里绝对不要手动new HttpClient,手动创建的实例没有正确配置基地址,也不符合依赖注入的最佳实践,很容易导致请求失败。
修复步骤:
第一步:在Startup里注册HttpClient服务
在ConfigureServices方法中添加HttpClient的依赖注入配置:
services.AddScoped(sp => { var navigationManager = sp.GetRequiredService<NavigationManager>(); return new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) }; });
第二步:在Razor页面中注入并使用HttpClient
修改你的Razor页面代码,通过@inject获取HttpClient,同时注意生命周期方法的版本问题(OnInitAsync是旧版方法,新版用OnInitializedAsync):
@inject HttpClient Http @functions { IList<Study> studies = new List<Study>(); protected override async Task OnInitializedAsync() { studies = await Http.GetFromJsonAsync<List<Study>>("/studies"); } }
3. 额外排查点
如果上面的修改后还是有问题,可以检查这几点:
- 确保
Study模型有公共无参构造函数,且所有需要序列化的属性都是public:public class Study { public Study() { } public int Id { get; set; } public string Title { get; set; } // 其他属性... } - 打开浏览器开发者工具(F12),查看网络请求中的
/studies请求,看是否有404、500等错误状态码,根据错误信息进一步定位问题。 - 确认
StudyRepository.GetStudies()确实返回了有效的数据集合。
按上面的步骤调整后,你的Blazor应用应该就能正常读取API的数据了。
内容的提问来源于stack exchange,提问作者nxvk919
相关产品推荐
相关产品推荐

