.NET 7 Minimal API中{culture}路由标签失效问题排查
问题解决:.NET 7 Minimal API 路由{culture}占位符无法被实际区域值替换
问题原因
Minimal API的路由占位符需要显式绑定到端点委托的参数才能生效。你当前的代码里,/{culture}/weatherforecast中的{culture}没有对应的参数传入处理方法,路由系统会把它当作字面量路径的一部分,所以只有输入/{culture}/weatherforecast才能匹配,而不是/en-US/weatherforecast。
控制器API之所以正常,是因为框架会自动将路由占位符与动作方法的参数进行绑定,无需额外配置。
解决方案
在你的端点处理方法中添加string culture参数,让路由系统自动将路径中的区域值绑定到这个参数上:
修改后的代码
var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); #region WeatherInfo var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; // 显式添加string culture参数,绑定路由占位符 app.MapGet("/{culture}/weatherforecast", (string culture) => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); return forecast; }) .WithName("GetWeatherForecast") .WithOpenApi(); #endregion app.Run(); record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); }
额外优化(可选)
如果需要限制culture必须是有效的区域代码格式(如en-US、tr-TR),可以给路由占位符添加正则约束:
app.MapGet("/{culture:regex(^[a-z]{2}-[A-Z]{2}$)}/weatherforecast", (string culture) => { // 业务处理逻辑 }) .WithName("GetWeatherForecast") .WithOpenApi();
这样只有符合xx-XX格式的区域值才能匹配该路由。
内容的提问来源于stack exchange,提问作者uuctum
相关产品推荐
相关产品推荐

