使用空路由指定可选的格式扩展名



我的控制器看起来像这样:

[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/为前缀。

无论什么都有效,我猜。

最新更新