ZetCode

ASP.NET MapControllers

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 MapControllers 方法。此方法对于在 ASP.NET Core 应用程序中启用特性路由至关重要。

ASP.NET Core 是一个跨平台框架,用于构建现代 Web 应用程序。MapControllers 使用特性简化了路由配置。

基本定义

MapControllers 是 ASP.NET Core 中的一个扩展方法,它将控制器操作的终结点添加到应用程序的请求管道。它为控制器启用了特性路由。

在应用程序配置中调用 MapControllers 时,它会扫描所有已注册的控制器以查找路由特性,如 [Route]、[HttpGet] 和 [HttpPost]。然后,它将这些特性映射到终结点路由。

MapControllers 通常用于最小 API 应用程序,或者当您只想使用特性路由时。它同时支持 MVC 和 Web API 控制器。

ASP.NET MapControllers 示例

以下示例演示了使用 MapControllers 的基本 Web API 设置。

Program.cs
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();

var app = builder.Build();

// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();

// Map controller routes
app.MapControllers();

app.Run();

此代码设置了一个基本的 ASP.NET Core Web API 应用程序。关键一行是 app.MapControllers(),它为应用程序中的所有控制器启用了特性路由。

Controllers/WeatherForecastController.cs
using Microsoft.AspNetCore.Mvc;

[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(Name = "GetWeatherForecast")]
    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();
    }

    [HttpGet("{days}")]
    public IEnumerable<WeatherForecast> GetByDays(int days)
    {
        return Enumerable.Range(1, days).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 record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

此控制器演示了两个不同的 HttpGet 终结点。第一个方法响应 GET /api/weatherforecast 并返回 5 天的天气预报。

第二个方法使用路由参数 {days} 来返回特定天数的预报。它响应诸如 GET /api/weatherforecast/7 这样的请求。

[ApiController] 特性启用了多个 Web API 约定,例如自动模型验证和错误响应的“Problem Details”。[Route] 特性设置了此控制器中所有操作的基本路径。

此示例演示了 MapControllers 如何根据其路由特性自动发现和映射这些终结点。在 Program.cs 中无需额外的路由配置。

来源

Microsoft ASP.NET Core 路由文档

在本文中,我们探讨了 ASP.NET 8 中的 MapControllers 方法。此强大功能简化了使用特性路由时的终结点配置。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 ASP.NET 教程