【发布时间】:2019-01-02 17:26:57
【问题描述】:
客户希望能够在我们的 WebApi GET 调用末尾添加一个文件扩展名,这将决定输出格式。
例如, 使用:
/api/v1.0/customers.xml
或
/api/v1.0/customers.json
或此 URL 的标头属性为 'accept: application/xml' 或 'accept: application/json'
/api/v1.0/customers
我有正确的格式与传递 header 属性一起使用。只要它不是控制器的“默认”路由,我还可以获得正确的格式以使用 URL 中的文件扩展名。
所以添加属性路由定义如下:
[HttpGet( ".{format?}" )]
public async Task<IActionResult> Get()
{ ... }
[HttpGet( "{id:long}.{format?}" )]
public async Task<IActionResult> Get( long id )
{ ... }
第一种方法(没有任何输入参数)会抛出错误。第二种方法可行。
我可以通过向“默认”方法添加另一个 HttpGet 属性来解决这个问题,如下所示:
[HttpGet]
[HttpGet( ".{format}" )]
public async Task<IActionResult> Get()
{ ... }
我从 HttpGet 创建了一个派生类。我想做的是让这个派生类为每个属性添加两条路由到路由表,一个带有格式,一个没有。我还没想好怎么做。
所以我希望它派生的 HttpGet 能够正常运行并根据其正常功能将路由放入路由表中,但我还希望它添加一个附加路由,并在末尾添加“.{format}”或路线。这应该可以处理我的所有情况。
我希望这两种方法看起来像下面显示的内容,并且自动添加了额外的“格式”路由(因为使用派生的 HttpGet 属性添加了新功能):
[HttpGet()]
public async Task<IActionResult> Get()
{ ... }
[HttpGet( "{id:long}" )]
public async Task<IActionResult> Get( long id )
{ ... }
有人有什么想法吗?我应该尝试不同的方法吗?
为了清楚起见,我需要为每个现有路由添加一个额外的路由,并在末尾添加“.{format}”,因为添加了可选的“?”如果路线内没有动作,字符将不起作用。
【问题讨论】:
-
然后只需将路由添加到操作中。该属性允许多个。
-
这我知道,但我希望它自动发生。当我知道单个属性应该能够执行我想要的操作时,我不想为每个操作添加两个属性。它只需要添加两条路线而不是一条。
标签: c# asp.net-core-mvc url-routing asp.net-core-webapi asp.net-core-routing