客户端希望能够在我们的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}”,因为添加了可选的“?”如果路线内没有任何动作,角色将不起作用。
答案 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)。