【问题标题】:How can I define a .NET 6 Minimal Web API route that includes a colon?如何定义包含冒号的 .NET 6 Minimal Web API 路由?
【发布时间】:2023-01-09 05:06:11
【问题描述】:

我创建了一个 .NET 6 Minimal Web API,它需要支持特定格式的 URL。需要接受的URL类似于/sensor/sensor:123/measurement

下面是相关的Program.cs。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.MapGet("/sensor/sensor:{sensorId}/measurement", (int sensorId) =>
{
    return Results.Ok();
});

app.Run();

但是,当我运行它并检查生成的 Swagger UI 时,我看到 GET URL 列为 /sensor/sensor}/measurement。正确尝试将 sensorId 显示为路径参数,但实际上通过此接口输入数据并执行会导致 404。

如果我将其修改为以下内容,我可以让它运行,并且它允许我在请求中传递冒号,但我更希望冒号是路由定义的一部分,因为它 a) 应该是和 b)需要额外的解析逻辑。

app.MapGet("/sensor/sensor{sensorId}/measurement", (string sensorId) =>
{
    return Results.Ok();
});

有没有办法在 .NET 6 Minimal Web API 中允许/转义冒号,以便它们可以成为定义路由的一部分?

【问题讨论】:

  • 冒号是 URI 中的一个特殊字符。尝试百分比编码。
  • @PoulBak : 在 URI 的路径部分中使用时不需要进行百分比编码(根据 RFC 3986),但我仍然会避免使用它,因为如果在非绝对 URI 中使用,那么许多库/工具/etc 很可能会将冒号解释为方案分隔符或其他组件。

标签: c# asp.net-web-api .net-6.0


【解决方案1】:

在 ASP.NET Core 中,如果在 {} 之间,: 是路由中的一个特殊字符。但是 Swashbuckle 中的一个错误将 : 解释为 {} 之外,就像它在里面一样。

https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2310

这在版本 6.2.4 中已修复。但实际上,ASP.NET Core API 模板在 6.2.3 版本中添加了 Swashbuckle,并带有该错误。

我们需要手动更新 NuGet 包 Swashbuckle。

【讨论】:

    【解决方案2】:

    概括

    将 Swashbuckle 更新到最新的 6.4.0 版本。

    更多信息:

    冒号是ASP.NET Core route templates中的一个特殊符号,使用to constraint route segments/values

    GetIntProduct 操作包含 int/{id:int} 模板。模板的 :int 部分将 id 路由值限制为可以转换为整数的字符串。

    [HttpGet("int/{id:int}")] // GET /api/test2/int/3
    public IActionResult GetIntProduct(int id)
    {
        return ControllerContext.MyDisplayRouteInfo(id);
    }
    

    似乎您使用的是 Swashbuckle,它将此冒号视为约束的一部分,因为实际上直接通过 %server-uri%/sensor/sensor:123/measurement 调用端点有效。

    更新

    将 Swashbuckle 更新到最新的 6.4.0,它解决了这个问题(the fixed version,那个对我不起作用的 - 6.2.3 包含在模板中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2022-01-13
      • 2022-06-11
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      相关资源
      最近更新 更多