C# 带格式的.NET核心MVC属性路由
客户端希望能够在WebApi GET调用的末尾添加文件扩展名,该调用将确定输出格式 比如说,, 使用: 或 或者此URL的标题属性为“accept:application/xml”或“accept:application/json”C# 带格式的.NET核心MVC属性路由,c#,asp.net-core-mvc,url-routing,asp.net-core-webapi,asp.net-core-routing,C#,Asp.net Core Mvc,Url Routing,Asp.net Core Webapi,Asp.net Core Routing,客户端希望能够在WebApi GET调用的末尾添加文件扩展名,该调用将确定输出格式 比如说,, 使用: 或 或者此URL的标题属性为“accept:application/xml”或“accept:application/json” /api/v1.0/customers 我使用了正确的格式来传递header属性。只要不是控制器的“默认”路径,我还可以获得正确的格式来处理URL中的文件扩展名 因此,添加如下定义的属性路由: [HttpGet( ".{format?}" )] public as
/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(“.{format?}”)]
公共异步任务Get()
{ ... }
[HttpGet(“{id:long}.{format?}”)]
公共异步任务获取(长id)
{ ... }
第一个方法(没有任何输入参数)将抛出错误。第二种方法会奏效
我可以通过向“default”方法添加另一个HttpGet属性来解决这个问题,如下所示:
[HttpGet]
[HttpGet( ".{format}" )]
public async Task<IActionResult> Get()
{ ... }
[HttpGet]
[HttpGet(“.{format}”)]
公共异步任务Get()
{ ... }
我已经从HttpGet创建了一个派生类。我想做的是让这个派生类为每个属性向路由表添加两条路由,一条使用格式,另一条不使用格式。我还不知道怎么做
因此,我希望它派生的HttpGet能够正常工作,并根据其正常功能在路由表中放置一个路由,但我也希望它添加一个额外的路由,在末尾或路由中添加“{format}”。这应该能处理我所有的情况
我希望这两个方法与下面显示的方法类似,并自动添加额外的“格式”路由(因为使用派生的HttpGet属性添加了新功能):
[HttpGet()]
公共异步任务Get()
{ ... }
[HttpGet(“{id: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]
公共异步任务Get()
{ ... }
[HttpGet(“{id:long}”)]
[HttpGetWithFormat(“{id:long}”)]
公共异步任务获取(长id)
{ ... }
这是可行的,但又不是我理想的解决方案。正如我在问题中所述,我应该能够创建一个同时执行这两项任务的自定义属性(HttpGet和HttpGetWithFormat)。然后只需将路由添加到操作中即可。该属性允许多个。我知道,但我希望它自动发生。当我知道一个属性应该可以做我想要的事情时,我不想为每个动作添加两个属性。它只需要添加两条路线,而不是一条。
[HttpGet]
[HttpGet( ".{format}" )]
public async Task<IActionResult> Get()
{ ... }
[HttpGet()]
public async Task<IActionResult> Get()
{ ... }
[HttpGet( "{id:long}" )]
public async Task<IActionResult> Get( long id )
{ ... }
[HttpGet]
[HttpGetWithFormat]
public async Task<IActionResult> Get()
{ ... }
[HttpGet( "{id:long}" )]
[HttpGetWithFormat( "{id:long}" )]
public async Task<IActionResult> Get( long id )
{ ... }