0

打电话时

http://mysite.com/Project/42

对于下面的路由和方法,我得到“找到与请求匹配的多个操作...Get(Int32)...Children(Int32)”

打电话时

http://mysite.com/Project/42/Children

正确返回。

我的路由是:

config.Routes.MapHttpRoute(
    name: "ForChildren",
    routeTemplate: "api/{controller}/{id}/Children",
    defaults: new { action = "Children" }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

还有我的方法:

public class ProjectController : ApiController {

    public IEnumerable<Project> Get(int id){
        ...
    }

    [HttpGet]
    public IEnumerable<Project> Children(int id) {
        ...
    }
}

我认为不指定操作会导致 Webapi 默认使用方法 (GET)。现在看起来 Webapi 正在运行不考虑名称的方法,只寻找参数匹配。我真的不相信这一点,并认为我在其他地方有过错。

4

3 回答 3

1

这是当前在 Web API 中操作选择如何工作的已知行为/问题。在您的请求是“ http://mysite.com/Project/42 ”的情况下,请求与“DefaultApi”路由匹配,并且在操作选择期间,操作选择器没有要求变量“操作”的值,因此它试图从可以通过 GET 方法访问的可用操作列表中找出。它试图根据路由参数(如此处的“id”)和查询字符串参数从 se 中找出最佳操作。在您的场景中,操作选择器看到 2 个获取操作,每个操作都接受 id 参数,因此它在选择它们时看到了歧义。

当前在此处提交了一个与您的情况类似的问题:http: //aspnetwebstack.codeplex.com/workitem/184

于 2013-05-10T22:30:38.520 回答
1

一个简单的解决方案是只有一条路线:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional, action = "DefaultAction"  }
);

然后装饰你的默认动作:

public class ProjectController : ApiController {

    [ActionName("DefaultAction")]
    public IEnumerable<Project> Get(){
        // api/project
        // Return all projects
    }

    [HttpGet]
    public IEnumerable<Project> Children(int id) {
        // api/project/1/children 
        // Return children of project with id == 1
    }
}
于 2013-05-11T10:53:29.033 回答
0

在 Web API 2 中,您可以使用属性路由:

[RoutePrefix("Project")]
public class ProjectController : ApiController {

    [Route("{id:int}")]
    public IEnumerable<Project> Get(int id){
        ...
    }

    [HttpGet]
    [Route("{id:int}/Children")]
    public IEnumerable<Project> Children(int id) {
        ...
    }
}
于 2014-07-11T04:19:25.133 回答