在 ASP.NET 中执行属性路由时如何从 url 检索后缀作为操作参数

How to retrieve a suffix from url as an action parameter when performing attribute routing in ASP.NET

给定 ASP.Net Core 中的属性路由(但我猜 MVC 和 WebAPI 的工作方式相同),我希望能够做这样的事情:

[Route("api/[controller]")]
public class SampleController : Controller {
    // GET api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css
    [HttpGet("{id}")] // this is wrong, how should it be written correctly?
    public string Get(Guid id, string urlSuffix) {
        return null; // return stuff based on the id and the full url
    }
}

在 URL 中以注释 (api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css) 为例,应使用以下参数调用 SampleController.Get 方法:

如果有额外的查询参数,这些也应该包含在后缀中。

我考虑过使用原始请求 URL,但我仍然需要一种方法来指定要执行的操作,但我想到的已经太晚了,ASP.Net 已经想到了表明没有任何 URL 用于给定的操作。

我想为此使用控制器,而不是将一些 "raw" 代码添加到 ASP.Net 核心执行管道中。

更新:

这个确切的例子不适用于 asp.net 核心 dotnet 核心和红隼服务:

[Route("api/[controller]")]
public class SampleController : Controller
{
    // GET api/values/5
    [HttpGet("{id}/{urlSuffix}")]
    public object Get(string id, string urlSuffix)
    {
        return new {id, urlSuffix};
    }
}

当我调用 http://localhost:5000/api/sample/some-id/folder 时,我得到了正确的结果,但是当我调用 http://localhost:5000/api/sample/some-id/folder/subfolder/file.extension 时,我得到了 404 错误。

引用:Handling a Variable Number of Segments in a URL Pattern

Sometimes you have to handle URL requests that contain a variable number of URL segments. When you define a route, you can specify that if a URL has more segments than there are in the pattern, the extra segments are considered to be part of the last segment. To handle additional segments in this manner you mark the last parameter with an asterisk (*). This is referred to as a catch-all parameter. A route with a catch-all parameter will also match URLs that do not contain any values for the last parameter.

您的模板和占位符将更改为...

[HttpGet("{id:guid}/{*urlSuffix}")]

鉴于以下 URL ...

"api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css"

然后

  • id = 123e4567-e89b-12d3-a456-426655440000
  • urlSuffix = "folder/subfolder/file.css"

因为/已经是模板的一部分,它将被排除在urlSuffix参数之外。

*urlSuffix 充当 URL 中 {id}/ 之后的所有内容的全部。如果有其他查询参数,这些参数也将包含在 urlSuffix 中。

您收到未找到错误,因为您的示例 URL 无法找到 api/sample/{id} 的匹配路由。

我根据您的原始示例包含了 :guid 路由约束,期望 Guid 用于 id 参数。

如果 id 不会成为 Guid 总是您可以删除约束,它将适用于您更新的示例。