Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带格式的.NET核心MVC属性路由_C#_Asp.net Core Mvc_Url Routing_Asp.net Core Webapi_Asp.net Core Routing - Fatal编程技术网

C# 带格式的.NET核心MVC属性路由

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

客户端希望能够在WebApi GET调用的末尾添加文件扩展名,该调用将确定输出格式

比如说,, 使用:

或者此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(“.{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 )
{ ... }