【问题标题】:Routing in WCF REST with hierarchical resources使用分层资源在 WCF REST 中路由
【发布时间】:2012-07-28 03:25:14
【问题描述】:

我有一个包含分层资源的 RESTful Web 服务。我想将这些资源分离到由全局路由类(global.asax)映射的不同服务类中。例如,如果我有这样的资源层次结构:

Book/
Book/{BookID}/Chapters/
Book/{BookID}/Chapters/{ChapterID}/
etc...

我只能像这样映射到一个类:

RouteTable.Routes.Add(new ServiceRoute("Books/", new WebServiceHostFactory()
  , typeof(BookService)));

这可行,但我必须在该单一服务中实现所有方法。我宁愿拥有多个服务类,如 BookService、ChapterService 等......就像这样:

RouteTable.Routes.Add(new ServiceRoute("Books/", new WebServiceHostFactory()
  , typeof(BookService)));

RouteTable.Routes.Add(new ServiceRoute("Books/{BookID}/Chapters/"
  , new WebServiceHostFactory(), typeof(ChapterService)));

但它不起作用......所以现在我不得不将我的所有方法都定义在一个服务中。有没有办法解决这个问题,或者我注定要使用这个庞大的服务类?

【问题讨论】:

  • 是否考虑过切换到 ASP.NET MVC4 Web API?它更适合 RESTful Web 服务,因为它主要针对此。
  • 这可能是我必须要做的......谢谢你的回答!
  • 我认为您不必这样做,但我建议您这样做。 :) 您是否尝试过反转路线,先添加更深的路线?

标签: c# wcf rest routing


【解决方案1】:

看看this answer。它与使用 ASP.NET Web API 的路由有关(一些 cmets 建议使用,我也会使用),但它也通常与开发 RESTful API 相关。我不会尝试在 API 中显示架构的层次结构,因为我认为这会增加很多不必要的复杂性。因此,您的 API 示例如下所示:

/Chapters/{ChapterID}?Book={BookID}

这消除了复杂的路由,API 用户更容易理解,并坚持 RESTful 原则。

【讨论】:

  • 我不同意“API 用户更容易理解”。我认为这更难理解,尤其是当您有多个子集合时。
  • @Martin1921 然后我们同意不同意。我说它更容易理解,因为它是大多数其他 REST API 和 OData 服务使用的约定 [odata.org/media/30002/OData.html#queryingcollections]
  • 我没关系。 :) 但是出于好奇,您在哪个部分找到了与此处描述的语法相似的语法?我在 10.2.3 下找不到任何东西。
  • 整个部分是关于查询集合的,它采用 http://{Server}/{Service}/{Resource}?{query or filter} 的基本格式。在上面的示例中,“Book=BookID”是仅返回与该查询匹配的章节的过滤器。您可能会争辩说,ChapterID 也是查询的一部分,并使用格式 /Chapters?Chapter={ChapterID}&Book={BookID}。这种格式清楚地表明正在对什么资源进行操作(在本示例中为章节),动词将指示哪个操作(即 GET、DELETE、POST、UPDATE)。
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多