我的路线:路由问题:找到了多个动作匹配请求
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" }
);
routes.MapHttpRoute(
name: "ApiControllerActionRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我的方法:
// GET api/Set/All
[ActionName("All")]
public IEnumerable<Set> GetSets()
{
var sets = _repository.GetAllSets();
return sets;
}
// GET api/Set/TopLevelSets
[ActionName("TopLevelSets")]
public IEnumerable<Set> GetTopLevelSets()
{
var sets = _repository.GetTopLevelSets();
return sets.ToList();
}
// GET api/Set/Breadcrumbs/1
[ActionName("Breadcrumbs")]
public IEnumerable<Set> GetBreadCrumbs(int id)
{
var sets = _repository.GetBreadcrumbs(id);
return sets.ToList();
}
// GET api/Set/5
public Set GetSet(int id)
{
Set set = _repository.GetSet(id);
if (set == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return set;
}
// PUT api/Set/5
public HttpResponseMessage PutSet(Set set)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
_repository.UpdateSet(set);
return Request.CreateResponse(HttpStatusCode.OK);
}
// POST api/Set
public HttpResponseMessage PostSet(Set set)
{
if (ModelState.IsValid)
{
_repository.AddSet(set);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, set);
return response;
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// DELETE api/Set/5
public HttpResponseMessage DeleteSet(int id)
{
_repository.DeleteSet(id);
return Request.CreateResponse(HttpStatusCode.OK, id);
}
在这一点上,我试图打本地主机/ API /套/ 1 - getSet方法。一切似乎都与路线一致,但由于某种原因,它不起作用。我错过了什么?
这是伪代码还是剪切粘贴?您的GetSet操作缺少ActionName注释:[ActionName(“Set”)],因此GetSet与您正在查找的Set路径不匹配 – 2013-03-04 03:39:49
剪切并粘贴 - 是否会触及第一条路线并说controller = Set和id = 1?在添加非标准方法和第二次路由注册之前,这是工作的。如果我添加Action注解,那么我不需要点击/ api/set/set/1? – RobVious 2013-03-04 03:45:28
否 - 动作名称属性实际上会将名称GetSet替换为所需的名称“Set”。通过使用[ActionName(“Set”)],它将具有Route/api(controller)/ set(action)/ 1(id) - 匹配您的GetSet操作。或者,您可以将您的操作从GetSet重命名为Set(这可能会更容易理解) – 2013-03-04 03:59:49