给定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
}
}
在以comment(api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css
)为例的URL中,SampleController.Get
应使用以下参数调用该方法:
123e4567-e89b-12d3-a456-426655440000
folder/subfolder/file.css
或/folder/subfolder/file.css
(我不太喜欢领导者/
)如果还有其他查询参数,则这些参数也应包含在后缀中。
我考虑过使用原始请求URL,但是我仍然需要一种方法来指定要执行的操作,而我想到的一切都为时已晚,ASP.Net已经发现给定的URL没有任何URL。行动。
我想为此使用控制器,而不是在ASP.Net Core执行管道中添加一些“原始”代码。
更新:
这个确切的示例不适用于asp.net核心dotnet核心和kestrel服务:
[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错误。
有时,您必须处理包含可变数量的URL段的URL请求。定义路由时,可以指定如果URL的段数大于模式中的段数,则多余的段数将被视为最后一段的一部分。要以这种方式处理其他段,请在最后一个参数上标记一个星号(*)。这称为全部参数。具有包罗万象参数的路由还将与不包含最后一个参数任何值的URL匹配。
您的模板和占位符将更改为...
[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
充当捕获所有后一切{id}/
在URL中。如果还有其他查询参数,这些参数也将包含在其中urlSuffix
。
由于出现示例网址找不到匹配的路由,因此出现了not found错误api/sample/{id}
。
我包括了:guid
基于您的原始示例的路由约束,该示例期望Guid
forid
参数。
如果id
不会Guid
总是,则可以删除该约束,它将在更新后的示例中起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句