ASP 网络核心属性路由和双正斜杠

ASP Net Core Attribute routing and double forward slash

正如所指出的 here,在 URL 中使用双斜杠是有效的。

我有一个使用属性路由的 ASP Net Core 项目,一个名为 GroupController 的控制器用于处理 Group 上的操作,以及一个用于 PUTting 的操作 RulePart 个组,由 string 类型的 ImportId 指定。

[Route("/api/[controller]")]
public class GroupController : ControllerBase
{
    [HttpPut("{groupImportId?}/ruleParts")]
    public async Task<IActionResult> PutRuleParts(string groupImportId, [FromBody]List<RulePartDto> ruleParts)
    {
        return null; //actual code ommitted for brevity
    }
}

一个 URL 像 http://localhost/api/group/groupImportId/ruleParts 符合预期。

我希望 null groupImportIds,即像 http://localhost/api/group//ruleParts 这样的 URLs 会调用相同的操作,因为 groupImportId 路由参数已被标记为可选.但是,当尝试调用此 URL 时,出现 404 错误并且未命中操作。

是否有可能在 ASP Net Core 中匹配一个空的 URL 路径段?

不要在路由模板中间使用可选参数。

应该在 URL 的末尾使用可选参数。当省略中间段中嵌入的可选参数时,路由将不匹配,因为这将导致未找到错误。

相反,属性路由允许将多个路由映射到同一操作。

[HttpPut("ruleParts")] // PUT api/group/ruleParts
[HttpPut("{groupImportId}/ruleParts")] //PUT api/group/123456/ruleParts
public async Task<IActionResult> PutRuleParts([FromBody]List<RulePartDto> ruleParts, string groupImportId = null) {
    //...
}

操作的 groupImportId 参数是可选的,以允许在请求其他路由时在 URL 中省略可选参数。

引用Routing to Controller Actions in ASP.NET Core