2

我正在为 WebApi 使用http://attributerouting.net/ nuget 包。这是我的两个 GET 方法和路由属性,用于列表和特定项目:

[GET("api/products/{tenantid}/{channelid}?{skip=0}&{take=20}&{status=1}")]
public IEnumerable<Product> Get(short tenantId, byte channelId, int status, int skip, int take)

[GET("api/products/{tenantid}/{channelid}/{id}")]
public Story Get(short tenantId, byte channelId, long id)

但在生成的帮助 URI 中,显示了三个 GET 选项。

GET api/products/{tenantid}/{channelid}?status={status}&skip={skip}&take={take} 
GET api/products/{tenantid}/{channelid}?id={id} 
GET api/products/{tenantid}/{channelid}/{id}

即使“id”不是第一个 GET 方法的参数。如何消除末尾带有“?id = {id}”的中间URI?我想我需要某种约束,但我无法从文档站点中弄清楚。

4

1 回答 1

2
  1. 要解决此问题,您可以以不同的方式命名操作。示例:GetAllProducts、GetProduct

  2. 您看到的问题是预期的行为,因为 ApiExplorer(HelpPage 使用)访问路由集合中的所有路由,并且对于每个路由,它都会检查以查看可以从该路由访问哪些操作。现在使用上面的属性修饰路由,路由集合中的路由很可能如下所示:

一种。“api/products/{tenantid}/{channelid}”、controller="Products"、action = "Get" 等...

湾。"api/products/{tenantid}/{channelid}/{id}", controller="Products", action = "Get"...

现在对于路线“a.”,ApiExplorer 检查可以到达哪些操作,并注意到对于控制器“产品”和操作“获取”,可以到达 2 个操作,并且它还尝试查看有多少参数来自路由路径本身,并且如果操作中有任何参数不是来自路由路径,则假定它来自查询字符串......因此您会看到“?id = {id} ”。希望这可以帮助。

于 2013-05-16T20:23:13.507 回答