ASP Net Core 属性路由和双斜杠

6

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

我有一个ASP Net Core项目,它使用属性路由,控制器名为GroupController,用于处理对Group执行操作,并且有一个用于PUT RulePart 的动作,它是通过其类型为stringImportId指定组的。

[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
    }
}

http://localhost/api/group/groupImportId/ruleParts 这样的 URL 能够得到预期的匹配。

我希望空的 groupImportId,即像 http://localhost/api/group//ruleParts 这样的 URL 也能调用同一个操作,因为 groupImportId 路由参数已被标记为可选。然而,在尝试调用这个 URL 时,我收到了 404 错误,并且该操作没有被执行。

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


请添加另一条路由,以便http://localhost/api/group/ruleParts也是有效的。 - Nkosi
@Nkosi 我不能选择Web客户端将要调用的内容,因此我无法控制他是否使用双斜杠。当问题实际上不是重复时,请不要将其标记为重复。 - Thaoden
此外,可选参数应该在URL的末尾使用,而不是嵌入到中间。您期望的和框架处理的方式是不同的。 - Nkosi
好奇一下,为什么一个导入会有可选的Id?这种情况的用例是什么? - Nkosi
我目前正在返回一个带有额外信息的404状态码。但是为了获得这些额外信息,我需要手动填充响应的操作。 - Thaoden
显示剩余6条评论
1个回答

5

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

可选参数应该在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中省略可选参数。参考ASP.NET Core控制器操作路由

2
所以基本上,Asp Net Core框架无法处理所有有效的URL?感谢您的建议,我将不得不在我的API上进行改进。 - Thaoden
@Thaoden 在这里测试一个理论。将参数改回可选项,就像您最初设置的那样 "{groupImportId?}/ruleParts",但是使用我在答案中提供的操作定义 string groupImportId = null。现在让我们看看当您调用 /api/group//ruleParts 时会发生什么。 - Nkosi
1
不过,如果能在某个地方看到这种行为的文档记录就更好了。 - Thaoden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接