我在使用多个HttpConfiguration.Routes.MapHttpRoute
以下是我的例子:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "AppResourceUserApi",
routeTemplate: "api/{controller}/{user}/{resource}"
);
config.Routes.MapHttpRoute(
name: "AppResourceUserMachineNameApi",
routeTemplate: "api/{controller}/{user}/{resource}/{machinename}"
);
我目前要做的是在用户使用不同选项时过滤Get return。
例如:
如果用户输入http://API/Items
- 他们将返回所有项目。
如果用户输入http://API/Items/John/Resource1/PC001
- 他们将获得按user="John"
,resource="Resource1"
,machinename="PC001"
我尝试使用([FromBody]string user, [FromBody]string resource, [FromBody]string machinename)
作为参数,但在DefaultApi和AppResourceUserMachineNameApi路由之间收到错误“找到了与请求匹配的多个操作”。
有没有办法利用这些映射来做我想要的事情?
谢谢,奥斯汀
答案 0 :(得分:0)
更改路线的顺序。需要比更具体的路线更晚地映射更一般的路线。
config.Routes.MapHttpRoute(
name: "AppResourceUserMachineNameApi",
routeTemplate: "api/{controller}/{user}/{resource}/{machinename}"
);
config.Routes.MapHttpRoute(
name: "AppResourceUserApi",
routeTemplate: "api/{controller}/{user}/{resource}"
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这是因为第一场比赛获胜。使用当前的映射顺序,网址http://API/Items/John/Resource1/PC001
将匹配
api/{controller}/{id}
其中{id} =“John / Resource1 / PC001”
但正如您所经历的那样,它会与其他路线发生冲突。但是根据建议的顺序,当它将某个操作与更具体的路由api/{controller}/{user}/{resource}/{machinename}
匹配时,它将使用该命令。
如果一切都失败了,你可以查看
Attribute Routing in ASP.NET Web API 2
此外,这不是如何使用[FromBody]
。它只能在动作中使用一次。
来源:Parameter Binding in ASP.NET Web API
最多允许一个参数从邮件正文中读取。所以 这不起作用:
// Caution: Will not work! public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }