如何在 .NET 6 中强制使用小写路由?

kim*_*udi 7 .net-6.0

我想在 .NET 6 API 项目中强制执行小写路由。

这是我的Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();
Run Code Online (Sandbox Code Playgroud)

这是我的WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;

namespace Weather.API.Controllers
{
    [ApiController]
    [Route("weatherforecast")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我预计只有小写路由(https://localhost:7243/weatherforecast)可以工作,但是带 pascal/uppercase 的路由也可以工作(https://localhost:7243/Weatherforecast)

我以为我可以添加builder.Services.AddRouting(options => options.LowercaseUrls = true);and app.UseRouting(),但我仍然可以使用 pascal/uppercase 访问路线:https://localhost:7243/Weatherforecast。

这是Program.cs我尝试过的修改后的文件,但不起作用:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRouting(options => options.LowercaseUrls = true);
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.UseRouting();

app.MapControllers();

app.Run();
Run Code Online (Sandbox Code Playgroud)

小智 18

要生成小写 URL,请将以下内容添加到Program.cs。(注意:这不会强制使用小写 URL)。

// generate lowercase URLs
builder.Services.Configure<RouteOptions>(options =>
{
   options.LowercaseUrls = true;
});

var app = builder.Build();
Run Code Online (Sandbox Code Playgroud)

要强制使用小写 URL,请创建一个基于 IRule 的规则,将所有大写 URL 重定向到小写 URL。

请参阅stackoverflow 答案和基于 IRule 的规则文档。

创建基于 IRule 的规则(即RedirectLowerCaseRule)后,将以下内容添加到Program.cs

var app = builder.Build();

// enforce lowercase URLs
// by redirecting uppercase urls to lowercase urls
var options = new RewriteOptions().Add(new RedirectLowerCaseRule());
app.UseRewriter(options);
Run Code Online (Sandbox Code Playgroud)