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

如何在.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,按以下顺序排查:

  1. 控制器是否添加[ApiController]和路由属性
  2. 控制器是否继承ControllerBase/Controller
  3. 服务端MapControllers()是否在UseRouting之后调用
  4. 客户端请求URL路径是否正确(注意大小写、api前缀)
  5. 控制器所在程序集是否被服务端扫描到(可通过AddApplicationPart强制指定)
  6. 查看服务端日志,确认控制器端点是否被正确注册

内容的提问来源于stack exchange,提问作者coolblue2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:43:17