我的控制器看起来像这样:
[FormatFilter]
[Route("api/foo")]
public class FooController : Controller
{
[HttpPost("")]
public IActionResult Foo()
{
...
}
}
我想添加一个可选的格式扩展名,如此处所述。但是,我希望路由最终像"/api/foo.json"一样。以下操作失败得惊人,为所有变体返回 404。
[HttpPost(".{format?}"]
我的下一个想法是做这样的事情:
[HttpPost("foo.{format?}")]
有效地将控制器范围的路由的该部分移动到操作。但是,这会引发 500,并显示错误:
错误:在段"foo.{format?}",可选参数"format"前面有一个无效的段"foo"。可选参数前面只能有一个句点 (.(。
显然,唯一有效的是
:[HttpPost("{id}.{format?}"]
换句话说,似乎可选格式参数必须始终遵循另一个参数才能工作,这对我来说似乎是一个绝对愚蠢的限制。我在这里错过了什么吗?有什么想法可以让这个静态路由工作吗?
容易*(经过大量的试验和错误(
[FormatFilter]
[HttpPost("foo"), HttpPost("foo.{format}")]
public class FooController : Controller
{
[HttpPost("")]
public IActionResult Foo()
{
...
}
}
或
[FormatFilter]
[HttpPost, Route("foo"), Route("foo.{format}")]
public class FooController : Controller
{
[HttpPost("")]
public IActionResult Foo()
{
...
}
}
*技巧:
- 可选参数"format"前面有一个无效的段 "噗。"可选参数前面只能有一个句点 (.(
- 一个操作接受多个工艺路线模板
显然,我放弃得太早了,尽管这一定是我所设想的最荒谬的解决方案之一。
[HttpPost("~/api/{foo=foo}.{format?}")]
从本质上讲,我只是在创建一个虚拟参数,我的操作实际上并没有使用我想要的路径片段的默认值。这满足了可选格式参数跟随另一个参数的要求,同时仍然允许我静态设置我的路由。
第一部分(~/api/
(只是一种指定路径段的方法,而不必更改我的控制器范围的路由。换句话说,任何其他操作仍然以api/foo/
为前缀。
无论什么都有效,我猜。