如何在.NET 8 Blazor WASM托管应用中恢复控制器功能?
在.NET 8 Blazor WASM托管应用中添加控制器并解决404问题
一、服务端配置修正与控制器创建
1. 确认服务端Program.cs核心配置
你的服务端代码已添加控制器基础配置,需核对以下细节:
builder.Services.AddControllersWithViews():已正确注册控制器服务app.MapControllers():已在路由配置后添加,确保控制器端点被映射- 中间件顺序:
UseRouting→UseAntiforgery→UseAuthorization→MapRazorComponents→MapControllers的顺序合规,无需调整 - 修正命名空间笔误:
typeof(RecoWeb.Client._Imports).Assembly需与项目实际命名空间一致(如改为typeof(RWeb.Client._Imports).Assembly)
2. 创建规范控制器
控制器必须满足以下要求才能被框架识别:
- 继承
ControllerBase或Controller - 添加
[ApiController]属性启用API控制器特性 - 添加路由属性(如
[Route("api/[controller]")])定义端点路径
示例控制器代码:
using Microsoft.AspNetCore.Mvc; namespace RWeb.Controllers; [ApiController] [Route("api/[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; [HttpGet] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }).ToArray(); } } public class WeatherForecast { public DateOnly Date { get; set; } public int TemperatureC { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); public string? Summary { get; set; } }
若控制器不在默认扫描范围内,可强制指定程序集:
builder.Services.AddControllersWithViews() .AddApplicationPart(typeof(WeatherForecastController).Assembly);
二、客户端调用控制器端点
你的客户端Program.cs已正确注册HttpClient,在Razor组件中调用时需注意:
- 使用正确的API路径(对应控制器路由,如
api/weatherforecast,控制器名需小写) - 可直接注入
HttpClient或通过IHttpClientFactory获取命名客户端
示例组件调用代码:
@inject HttpClient Http @inject IHttpClientFactory HttpClientFactory <button @onclick="FetchWeatherData">获取天气数据</button> @if (_forecasts != null) { <div> @foreach (var forecast in _forecasts) { <p>@forecast.Date: @forecast.Summary (@forecast.TemperatureC℃)</p> } </div> } @code { private WeatherForecast[]? _forecasts; private async Task FetchWeatherData() { // 方式1:使用默认HttpClient _forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("api/weatherforecast"); // 方式2:使用命名HttpClient var client = HttpClientFactory.CreateClient("ServerAPI"); _forecasts = await client.GetFromJsonAsync<WeatherForecast[]>("api/weatherforecast"); } public class WeatherForecast { public DateOnly Date { get; set; } public int TemperatureC { get; set; } public string? Summary { get; set; } } }
三、404错误排查清单
若仍出现404,按以下顺序排查:
- 控制器是否添加
[ApiController]和路由属性 - 控制器是否继承
ControllerBase/Controller - 服务端
MapControllers()是否在UseRouting之后调用 - 客户端请求URL路径是否正确(注意大小写、api前缀)
- 控制器所在程序集是否被服务端扫描到(可通过
AddApplicationPart强制指定) - 查看服务端日志,确认控制器端点是否被正确注册
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

