如今在.NET中实现RESTful架构的最佳方式是什么?

17

在提问之前,我已经意识到这个问题之前已经被问过了,但是那个时候 WCF4 还没有发布!

所以,经过大量阅读后,我决定采用RESTful架构来开始数据提供的API。考虑到发布的 WCF 4、ASP.NET MVC 2 和 WCF REST starter kit,现在开始实现RESTful架构的最佳方式是什么?

我:WCF4 还是 ASP.NET MVC?(或者其他类似于 wcf rest starter kit 的东西)具体而言,我想要:

  • 易于实现
  • 我熟悉 ASP.NET MVC,但不熟悉 WCF。WCF 是否值得学习?
  • 对于 REST,WCF4 是否过于复杂,而 ASP.NET MVC 又是否会在某些方面表现不足?

1
没有足够的信息来回答这个问题。看看已有的答案。它们没有实质性的内容,只是“使用这个因为我有”。回答这些问题的唯一方法是将功能与您的确切要求进行比较。因为除了“低带宽”(这与底层框架无关)和“许多客户端”(这正是REST的定义)之外,您没有提供任何东西,所以几乎不可能给出任何实质性的建议。 - John Farrell
@Alex:对问题的奇怪解释,考虑到他正在寻求“最好的”并引用“WCF 4、ASP.NET MVC 2和WCF REST”。 - John Farrell
@Alex 谢谢。@jfar 我已经尝试让它更具体了。我只是想知道是否有人在这两条路上走了很长的路程,并发现它是完美的还是有缺陷。 - BritishDeveloper
1
为什么你要局限于微软框架呢?在Web开发和ReST API方面,这显然不是创新的地方。 - SerialSeb
5个回答

20

我实际上已经实现或正在使用这三个发布的选项中的所有选项,所以我会给出我的看法。现在你澄清了你想要什么,回答起来就更容易了。

OData

OData非常适合内部应用程序,当:

  1. 你既是服务器又是客户端。
  2. 你正在使用Entity Framework。
  3. 你不使用继承在你的模型,并且不希望查询子集合。

Odata非常棒,因为你可以在客户端使用IQueryable。然而,这也有一些限制。前两个限制包括使用继承模型有些尴尬,还有你无法查询嵌套集合

还有一个问题是不知道 支持的LINQ功能 是什么。

如果你绝对需要一个服务层,并且只希望进行简单的CRUD操作,我建议使用OData。所有OData问题的主要问题都导致了一个硬性墙壁,有时你根本无法避免。客户端消费者代码实际上是最好的部分,如果你不使用C#进行消费,可能不值得。此外,如果没有使用EF的自动元数据支持,则将编写与消费者可能或可能不喜欢针对其编写的模式相同数量的代码。虽然有一个OData的Rails包装器,但所有这些都是相对较新的。我还没有看到OData在野外出现,除了一些非常大的MS合作伙伴。

OData身份验证和过滤也非常基础。如果您需要限制数据,则需要自己编写许多权限相关的代码。如果您想要通过权限限制SELECT * FROM TABLE,请准备编写一些尴尬的代码。

MVC 2

  • MVC对于创建RESTful服务非常好用。它支持HTTP动词,使用return JSONResult非常方便。唯一的潜在缺点是你需要自己编写大量的错误处理代码,并且所有的视图模型都应该继承一个基类,该基类可以显示状态码和错误信息。

  • 如果您想要定制消息回复的外观或遵循惯例,您可能还需要微调MVC的视图引擎。 MVC的巨大优点是它非常可扩展,几乎可以做任何想做的事情。 我尤其喜欢将表单、ajax调用和rest服务组合到同一个控制器操作中。 只需实现一次,就可以得到三种相同操作的不同版本。 基本上很难使MVC无法胜任,因为它可以扭曲成几乎任何你需要的形式。

  • 使用MVC服务的一个巨大优点是您可以在部署的应用程序中添加一个小型管理界面。 这样非常方便,就不需要再部署两个站点了。

  • WCF REST

    我只是以非常有限的方式使用WCF rest,感觉还可以…… 我已经使用了3年WCF,总是对如何扩展它感到不满。 与ODATA一样,如果你走出通常的路线,你很快就会遇到封闭的类和不可扩展的功能空间。 这与MVC的可扩展性的数量形成了鲜明对比。

  • 另一个问题是您正在构建基于WCF的应用程序,并且所有WCF的疯狂问题都伴随着它。 我总是说使用WCF需要一个博士学位。Rick Strahl有一篇关于WCF REST的痛点的好文章。 不确定事情是否已经改变,但值得一读。

  • WCF REST看起来非常有前途,我现在正在使用它,但我不了解足够多的内容来推荐。

  • 如果你不了解你的消费者,我会认为你也不了解你的API。在有使用案例且能进行编码之前,请不要构建服务。

  • MVC是最具可扩展性的,如果你熟悉底层工作原理,那么你可能比实现难以扩展的MS东西(如OData和WCF)更好。

  • 像Facebook、Amazon、PayPal、Ebay这样的“大公司”都有API,它们并不遵循任何已知的模式或架构,如OData。你的REST服务实际上取决于你自己。这涉及到第1点。首先专注于让消费者易于使用。


  • 你因为“主要观点 #1”而获得了一个赞 :-) 很多人试图设计一个基于只暴露数据而不需要理解如何使用的 API。 - Darrel Miller
    非常好的答案,谢谢。关于#1,网站数据服务都是通过asp.net mvc网站编写和交付的。刚刚收到一个新的要求:“我们需要为iPhone应用程序提供API,也许将来还有其他东西。”我对这个领域知之甚少,所以感谢您的帮助! - BritishDeveloper
    +1 jfar - 非常好的总结。我已经使用了WCF(http)和MVC来完成这个任务。我喜欢在WCF中非常“容易”的身份验证,而在MVC中则更加痛苦。如果在一个处理身份验证的MVC-REST实现中解决了这个问题,那么我认为它将成为我们所有RESTful服务的首选平台。但事实上,我们仍然有一些要求只有目前的WCF才能满足(安全方面)。 - jim tollan
    @jim 鉴定难道不是通过 cookie / formsauthentication 处理的吗?因为它只是基于 HTTP 的。 - BritishDeveloper
    在我的情况下,我正在公开一些公共(90%)和私有API方法,这些方法以XML / JSON的形式公开。这就是发生身份验证问题的原因-即没有登录表单。在表单的情况下,这一切都很好。需要处理的是“静默”请求。我还没有完全掌握MVC中的通用方式。 - jim tollan
    +1 对于那个狡猾的管理员界面建议的赞同 - micahhoover

    12
    你应该查看OpenRasta。它是一个资源中心的框架,专门设计用于在.NET中实现RESTful架构,并提供对HTTP内容协商和摘要身份验证等功能的强力支持。
    OpenRasta的方法是,您的API应该根据资源(通常与API实体模型紧密映射)和编解码器来定义,这些编解码器为这些资源提供了解耦的XML、JSON、HTML或任何其他内容格式的序列化/表示。
    它是开源的,完全使用.NET编写,包括内置的IoC和依赖注入支持(这是它内部大量连接的方式),并在MIT许可下分发。
    版本2.0已经稳定一段时间了,并且正在一些地方的生产中使用-最著名的是Huddle
    我认为,OpenRasta对资源的强调意味着它比许多“多用途”Web/HTTP框架更接近Roy Fielding对RESTful架构的最初愿景,包括WCF和ASP.NET MVC。

    1
    我的经验是将资源映射到实体是一个不好的想法。我更成功的做法是将资源视为ViewModels或DTOs。 - Darrel Miller
    啊 - 我所说的“API实体模型”与“领域模型”是有区别的...你完全正确,只是我没有解释清楚。 - Dylan Beattie

    7
    在做出任何决定之前,请注意WCF中的HTTP/REST支持正在发生重大变化。请参阅http://wcf.codeplex.com/。将有大量的向后兼容性,但新库从HTTP和WCF的角度来看是完全重新编写的。
    此外,请注意,尽管OData对于特定子集的应用程序非常有用,但它并不是通用的REST框架。
    如果您需要.net的东西,并且您真的想正确地执行REST,则请查看OpenRasta。如果您只想做REST,因为它具有良好的营销效果,那么ASP.NET MVC可能已经足够了。如果您只处于实验阶段,那么我会继续关注新的WCF库。

    1

    我曾经非常成功地使用了Visual Studio扩展管理器中提供的WCF Rest服务应用程序模板。如果你想快速入门,那就是我会去的地方。


    1

    如果您的项目是建立在ORM框架之上或者您可以将所有数据保存在内存集合中,那么OData就是最好的选择。如果不是(例如您通过存储过程或类似方式获取数据),那么就选择WCF HTTP服务(也称为WCF REST)。

    OData非常有前途,并且在IQueryable接口的基础上具有很大的灵活性。实际上,它有点像RESTful LINQ。但是,除非您有一些ORM作为支撑,否则您将不得不自己实现IQueryable相关内容,这几乎就像实现一个ORM。此时,您最好使用更低级别的WCF HTTP服务,这样您就可以获得更多的控制权,并且可以按照自己的意愿来设计资源。客户端库可能不会那么强大,但是也不会期望服务实现所有查询运算符。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接