MVC3 REST路由& Http动词

时间:2012-01-04 02:35:50

标签: c# asp.net-mvc http rest routing

由于我的previous question,我发现了两种在MVC3中处理REST路由的方法。

这是一个后续问题,我试图了解这两种方法之间的事实差异/细微差别。如果可能,我正在寻找权威的答案。

方法1:单一路线,在控制器操作上使用操作名称+ Http动词属性

  1. 使用指定的Global.asax参数在action中注册单个路由。

    public override void RegisterArea(AreaRegistrationContext context)
    {
        // actions should handle: GET, POST, PUT, DELETE
        context.MapRoute("Api-SinglePost", "api/posts/{id}", 
            new { controller = "Posts", action = "SinglePost" });
    }
    
  2. ActionNameHttpVerb属性应用于控制器操作

    [HttpGet]
    [ActionName("SinglePost")]
    public JsonResult Get(string id)
    {
        return Json(_service.Get(id));
    }
    [HttpDelete]
    [ActionName("SinglePost")]
    public JsonResult Delete(string id)
    {
        return Json(_service.Delete(id));
    }
    [HttpPost]
    [ActionName("SinglePost")]
    public JsonResult Create(Post post)
    {
        return Json(_service.Save(post));
    }
    [HttpPut]
    [ActionName("SinglePost")]
    public JsonResult Update(Post post)
    {
        return Json(_service.Update(post););
    }
    
  3. 方法2:唯一路由+动词约束,在控制器操作上使用Http动词属性

    1. 使用Global.asax

      HttpMethodContraint中注册唯一路线
      var postsUrl = "api/posts";
      
      routes.MapRoute("posts-get", postsUrl + "/{id}", 
          new { controller = "Posts", action = "Get",
          new { httpMethod = new HttpMethodConstraint("GET") });
      
      routes.MapRoute("posts-create", postsUrl, 
          new { controller = "Posts", action = "Create",
          new { httpMethod = new HttpMethodConstraint("POST") });
      
      routes.MapRoute("posts-update", postsUrl, 
          new { controller = "Posts", action = "Update",
          new { httpMethod = new HttpMethodConstraint("PUT") });
      
      routes.MapRoute("posts-delete", postsUrl + "/{id}", 
          new { controller = "Posts", action = "Delete",
          new { httpMethod = new HttpMethodConstraint("DELETE") });
      
    2. 仅在Controller Actions上使用Http Verb属性

      [HttpGet]
      public JsonResult Get(string id)
      {
          return Json(_service.Get(id));
      }
      [HttpDelete]
      public JsonResult Delete(string id)
      {
          return Json(_service.Delete(id));
      }
      [HttpPost]
      public JsonResult Create(Post post)
      {
          return Json(_service.Save(post));
      }
      [HttpPut]
      public JsonResult Update(Post post)
      {
          return Json(_service.Update(post););
      }
      
    3. 这两种方法都让我拥有唯一的命名控制器操作方法,并允许与动词... 绑定的RESTful路由,但是限制路由与使用代理操作名称本质上有什么不同?

3 个答案:

答案 0 :(得分:1)

你不会得到一个权威的答案,这是我的2美分:

我更喜欢方法2,因为那时你将所有路由放在一个地方。您可以将路由封装到一个方法中,例如MapResourceRoutes(string controller, string uri)并在整个API中使用过多次。

方法2还为您提供了可用于链接和反向路由的明确命名的路由。

答案 1 :(得分:0)

我不知道你会找到一个权威的答案,但我会提出我的意见,你可以告诉我的观点,我的意见很重要;-)。我的纯粹自我认为第一个选项更纯粹,但是我的经验是Url.Action()这样的辅助方法有时候很难用这种方法解决正确的路径而且我已经采用了第二种方法,因为它实际上只有内部的影响因为api看起来与消费者相同。

答案 2 :(得分:0)

此时,正确的答案是使用Web API。