多个MapHTTPRoutes的问题

时间:2017-01-17 22:17:17

标签: c# asp.net-web-api asp.net-web-api-routing

我在使用多个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路由之间收到错误“找到了与请求匹配的多个操作”。

有没有办法利用这些映射来做我想要的事情?

谢谢,奥斯汀

1 个答案:

答案 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) { ... }