带有格式的.NET Core MVC属性路由

时间:2018-07-25 19:45:35

标签: c# asp.net-core-mvc url-routing asp.net-core-webapi asp.net-core-routing

客户端希望能够在我们的WebApi GET调用的末尾放置文件扩展名,这将决定输出格式。

例如, 用途:

/api/v1.0/customers.xml

/api/v1.0/customers.json

或此标头属性为'accept:application / xml'或'accept:application / json'的URL

/api/v1.0/customers

我通过传递标头属性使用了正确的格式。只要它不是控制器的“默认”路由,我还可以获得与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}”,因为添加了可选的“?”如果路线内没有任何动作,角色将不起作用。

1 个答案:

答案 0 :(得分:0)

我从HttpGetAttribute创建了派生类,该派生类在路由字符串的正确位置附加了“。{format}”。

所以控制器动作如下:

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

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

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