.NET核心MVC属性路由与格式



客户端希望能够在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}"的现有路由添加一个额外的路由,因为如果路由中没有操作,则添加可选的"?"字符是无效的。

我从HttpGetAttribute创建了一个派生类,该类在路由字符串的正确位置添加了".{format}"。

所以控制器的动作看起来像这样:

[HttpGet]
[HttpGetWithFormat]
public async Task<IActionResult> Get()
{ ... }
[HttpGet( "{id:long}" )]
[HttpGetWithFormat( "{id:long}" )]
public async Task<IActionResult> Get( long id )
{ ... }

这是有效的,但这不是我理想的解决方案。正如我在问题中所说的,我应该能够创建一个同时做这两件事的自定义属性(HttpGet和HttpGetWithFormat(。

最新更新