2013-03-04 62 views
1

我的路线:路由问题:找到了多个动作匹配请求

  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方法。一切似乎都与路线一致,但由于某种原因,它不起作用。我错过了什么?

+1

这是伪代码还是剪切粘贴?您的GetSet操作缺少ActionName注释:[ActionName(“Set”)],因此GetSet与您正在查找的Set路径不匹配 – 2013-03-04 03:39:49

+0

剪切并粘贴 - 是否会触及第一条路线并说controller = Set和id = 1?在添加非标准方法和第二次路由注册之前,这是工作的。如果我添加Action注解,那么我不需要点击/ api/set/set/1? – RobVious 2013-03-04 03:45:28

+0

否 - 动作名称属性实际上会将名称GetSet替换为所需的名称“Set”。通过使用[ActionName(“Set”)],它将具有Route/api(con​​troller)/ set(action)/ 1(id) - 匹配您的GetSet操作。或者,您可以将您的操作从GetSet重命名为Set(这可能会更容易理解) – 2013-03-04 03:59:49

回答

2

您的默认路由没有设置默认操作,因此当您使用“获取”操作时,路由引擎无法决定是否需要GetTopLevelSets或GetSet。添加默认会解决这个问题:

routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { action = "GetSet" }, 
       constraints: new { id = @"^\d+$" } 
      ); 

本来就使用默认为您GetSet行动在你的控制器:api/set (controller)/1 (id)路线。

+0

非常感谢。那么我想要通过api/set(controller)访问Put动作呢? 或DeleteSet> api/set/id用于DELETE? – RobVious 2013-03-04 04:48:01

+0

他们应该仍然工作 - 你的问题是,当你有'Get'Action时,路由引擎无法决定你是否想要GetTopLevelSets或GetSet。现在,它将在Get请求上默认为GetSet(put/post/delete仍将默认为它们自己)。你必须明确地访问GetTopLevelSets。 – 2013-03-04 05:08:15

+0

知道了!感谢Mark的解释。 – RobVious 2013-03-04 14:17:15

1

您是否缺少查询的api部分? localhost/api/set/1

+1

哎呦!打错了那一点。我的确在尝试/ api/set/1 – RobVious 2013-03-04 03:39:58

相关问题