在 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
方法:
- id:
123e4567-e89b-12d3-a456-426655440000
- urlSuffix:
folder/subfolder/file.css
或 /folder/subfolder/file.css
(我不太关心前导 /
)
如果有额外的查询参数,这些也应该包含在后缀中。
我考虑过使用原始请求 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
总是您可以删除约束,它将适用于您更新的示例。
给定 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
方法:
- id:
123e4567-e89b-12d3-a456-426655440000
- urlSuffix:
folder/subfolder/file.css
或/folder/subfolder/file.css
(我不太关心前导/
)
如果有额外的查询参数,这些也应该包含在后缀中。
我考虑过使用原始请求 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
总是您可以删除约束,它将适用于您更新的示例。