指定带有空路由的可选格式扩展名

Chr*_*att 5 asp.net-core asp.net-core-2.0

我的控制器看起来像:

[FormatFilter]
[Route("api/foo")]
public class FooController : Controller
{
    [HttpPost("")]
    public IActionResult Foo()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我要添加一个可选的格式扩展名,如此处所述。但是,我希望路由以`/api/foo.json'结尾。以下操作失败,返回所有版本404。

[HttpPost(".{format?}"]
Run Code Online (Sandbox Code Playgroud)

我的下一个想法是在做类似的事情:

[HttpPost("foo.{format?}")]
Run Code Online (Sandbox Code Playgroud)

有效地将控制器范围的路线的那部分移动到动作上。但是,这将引发500,并显示错误:

错误:在段'foo。{format?}'中,可选参数'format'前面是无效的段'foo。'。在可选参数之前只能有一个句点(。)。

显然,这唯一的意志的工作是沿着线的东西:

[HttpPost("{id}.{format?}"]
Run Code Online (Sandbox Code Playgroud)

换句话说,似乎可选的格式参数必须始终跟随另一个参数才能起作用,这对我来说似乎是绝对骨头的限制。我在这里想念什么吗?有什么想法可以像这样的静态路由使它起作用吗?

McK*_*bue 5

Easy peasy *(经过大量试验和错误)

[FormatFilter]
[HttpPost("foo"), HttpPost("foo.{format}")]
public class FooController : Controller
{
    [HttpPost("")]
    public IActionResult Foo()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

[FormatFilter]
    [HttpPost, Route("foo"), Route("foo.{format}")]
    public class FooController : Controller
    {
        [HttpPost("")]
        public IActionResult Foo()
        {
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

*提示:

  • 可选参数 'format' 前面有一个无效的段 'foo.'。只有句点 (.) 可以位于可选参数之前
  • 一个动作接受多个路由模板


Chr*_*att 2

显然,我放弃得太早了,尽管这肯定是我想到过的最荒谬的解决方案之一。

[HttpPost("~/api/{foo=foo}.{format?}")]
Run Code Online (Sandbox Code Playgroud)

本质上,我只是创建一个虚拟参数,我的操作实际上并不采用我想要的路径片段的默认值。这满足了可选格式参数遵循另一个参数的要求,同时仍然允许我静态设置我的路线。

第一部分 ( ~/api/) 只是指定路径部分的一种方式,而无需更改我的控制器范围的路由。api/foo/换句话说,任何其他操作仍然以 为前缀。

我想,无论什么有效。