【问题标题】:Multi-Level Routing in ASP.NET web API without Areas无区域的 ASP.NET Web API 中的多级路由
【发布时间】:2012-04-19 09:08:42
【问题描述】:

我正在尝试使用新的 ASP.NET Web API 来执行以下操作:

/api/business/{id} 的GET 获取企业的目录信息。对同一 URL 的 PUT 会更新信息等。该部分工作正常。当我想添加以前的操作以查看对该业务的评论时,我遇到了问题。理想情况下,我希望可以通过/api/business/{id}/reviews 联系到,其中 GET 返回评论,POST 提交新评论,等等。

在普通的 ASP.NET MVC 应用程序中,我可以定义两个操作方法(Reviews 和 PostReview),然后使用属性来更改操作名称并接受第二个函数的 HTTP 方法。我希望有一些方法可以用新系统中的类来做到这一点,但我无法弄清楚它是什么,而且我在文档中没有看到任何关于这个问题的信息。

使用区域并工作,据我所知:我需要/business/{id} URL 才能工作并处理中断的区域。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing asp.net-web-api


    【解决方案1】:

    Web API 确实支持按操作路由,因此您可以执行以下操作:

    routes.MapHttpRoute(
        name: "ActionApi",
        routeTemplate: "api/{controller}/{id}/{action}",
        defaults: new { action = "DirectoryInfo", id = RouteParameter.Optional }
    );
    

    控制器方法:

    [HttpGet]
    [ActionName("DirectoryInfo")]
    public void GetDirectoryInfo(int id)
    
    [HttpPut]
    [ActionName("DirectoryInfo")]
    public void PutDirectoryInfp(int id)
    
    [HttpGet]
    public void Review(int id)
    
    [HttpPost]
    [ActionName("Review")]
    public void PostReview(int id)
    

    另一种选择是创建两个控制器,BusinessController 和 ReviewController,并创建以下路由:

    routes.MapHttpRoute(
        name: "BusinessRoute", 
        routeTemplate: "api/business/{id}", 
        defaults: new { controller = "Business", id = RouteParameter.Optional }
        );
    routes.MapHttpRoute(
        name: "reviewsRoute", 
        routeTemplate: "api/contacts/{id}/reviews/", 
        defaults: new { controller = "Reviews", id = RouteParameter.Optional}
        );
    

    然后使用 Web API 样式的隐式操作名称。

    【讨论】:

      【解决方案2】:

      DDD 的角度来看,如果审查是一个聚合(它有自己的存储库),那么它需要自己的控制器。如果 Post 是它的根聚合,那么它必须与 Post 本身一起返回。

      形成我所看到的,它是一个根聚合,因此它需要自己的控制器。因此你有:

      /api/reviews/{id}
      

      /api/reviews?postId={postId}
      

      其中 id 是帖子的 ID。


      这主要是由于我们不再有动作造成的。我对此并不完全满意,但这就是我们所拥有的。

      【讨论】:

      • 而且没有办法使用路由或任何东西来模拟它们?只要有一种方法可以优雅地路由到它们,我就可以用每个类 1 个动作代替每个方法 1 个动作。此外,最终可能还有/api/reviews,但对我来说,让业务也可以访问一组评论似乎更直观。
      • @ehdv glenn 块在他的示例中有两个控制器,一个用于实体,另一个用于其集合。所以这是他的意图,但也许稍后会添加行动。
      【解决方案3】:

      使用区域不起作用,据我所知:我需要 /business/{id} URL 才能工作,并且使用区域中断。

      作为记录,您可以通过覆盖 ASP.NET MVC 的 DefaultHttpControllerSelector 来让 Areas 和 WebApi 正常运行。我已经在工作中的 ASP.NET MVC 中解决了这个问题。请参阅以下博客了解我的实现以及如何将区域支持引入 WebApi 的更多详细信息:

      http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多