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

时间:2010-11-30 20:24:29

标签: asp.net-mvc wcf rest

在你提到它之前我知道这个问题之前已经被问到,但是自WCF4推出以来没有!

因此,经过大量阅读后,我认为RESTful架构是开始数据提供API的前进方向。考虑到发布WCF 4,ASP.NET MVC 2和WCF REST入门套件,现在开始实现RESTful架构的最佳方法是什么?

我: 我对ASP.NET MVC非常熟悉所以我觉得很舒服。但是,我对WCF的了解不足。

那么 WCF4或ASP.NET MVC?(或其他类似wcf rest starter kit)?具体来说,我正在寻找:

  • 易于实施
  • 我知道ASP.NET MVC,而不是WCF。 WCF值得学习吗?
  • 对于REST来说WCF4是否过度,或者ASP.NET MVC会在某些时候出现问题?

5 个答案:

答案 0 :(得分:20)

我实际上已经实现了或者目前正在使用所有3个已发布选项,所以我会给出我的看法。现在你已经澄清了你想要的东西,它更容易回答。

<强>的OData

在以下情况下,OData非常适合内部应用程序:

  1. 您既是服务器又是客户端。
  2. 您正在使用实体框架。
  3. 您不在模型中使用继承,也不希望查询子集合。
  4. Odata非常棒,因为您可以在客户端使用IQueryable。但这有一些限制。我的头脑中的两个包括你使用继承模型有点尴尬,你can't do nested collections

    还有一个问题,我不知道supported LINQ capabilities are

    我建议OData你绝对需要一个服务层,只希望用它们做简单的CRUD操作。每个OData问题的主要问题都会导致你有时无法绕过的硬墙。客户端消费者代码确实是最好的部分,如果你不使用C#来消费它可能不值得。

    此外,如果不使用EFs自动元数据支持,您将编写相同数量的代码以符合您的消费者可能喜欢或可能不喜欢写的模式。虽然OData有一个Rails包装器,但所有这些都是相对较新的。除了非常大的MS合作伙伴之外,我没有看到野外OData。

    OData身份验证和过滤也非常简单。如果您需要限制数据,您将自己编写许多与权限相关的代码。如果您希望SELECT * FROM TABLE受权限限制,请准备编写一些尴尬的代码。

    MVC 2

    MVC非常适合制作RESTful服务。你有动词支持,return JSONResult就像它一样容易。唯一潜在的缺点是您自己编写了大量错误处理代码,并且所有视图模型都应该从显示状态代码和错误消息的基类继承。

    您可能还想稍微调整视图引擎,具体取决于您希望消息回复的花哨或约定驱动程度。 MVC的巨大好处是它非常可扩展,您几乎可以随心所欲地做任何事情。我很擅长将表单/ ajax调用/和休息服务组合到同一个控制器操作中。实施一次,获得相同操作的三种风格。很难让MVC失败,因为它可以被扭曲以做几乎你需要的任何事情。

    MVC服务的一大好处是,您可以在与服务一起部署的应用程序中隐藏一些管理UI。非常方便,不需要部署两个站点。

    WCF REST

    所以我只是在非常有限的容量中使用WCF休息而且看起来......好吧......我已经使用了WCF 3年了,而且我总是不满意扩展它是多么令人沮丧的复杂。就像ODATA一样,如果你走出人迹罕至的道路,你会遇到密封的类和不可扩展的功能洞穴。这与MVC的可扩展性量形成鲜明对比。

    另一个问题是你在WCF之上建立了所有与之相关的疯狂。我总是说它需要博士才能有效地使用WCF。 Rick Strahl写了一篇关于pain points of WCF REST的好文章。不确定事情是否已经改变但值得一读。

    WCF REST看起来非常有前途,我现在正在使用它我只是不太了解推荐它。

    要点

    1. 如果您不了解您的消费者,那么我认为您不了解您的API。在有用例之前不要构建服务,并且可以对其进行编码。

    2. MVC是最具扩展性的,如果你熟悉内幕如何工作,你可能会比实现像OData和WCF这样难以扩展的MS更好。

    3. 像Facebook,亚马逊,PayPal,Ebay这样的所有“大男孩”都拥有的API并不真正符合任何已知的模式或架构,如OData。您的REST服务实际上就是您的服务。这与#1有关。专注于让消费者首先轻松工作。

答案 1 :(得分:12)

你应该看看OpenRasta。它是一个以资源为中心的框架,专门用于在.NET中实现RESTful架构,并且支持HTTP内容协商和摘要式身份验证等。

OpenRasta的方法是,不是根据动词(动作)实现API,而是应该根据资源(通常将紧密映射到您的API实体模型)和编解码器来定义API,这些编解码器提供了解耦的序列化/表示这些资源是XML,JSON,HTML或您的API需要支持的任何其他内容格式。

它是完全用.NET编写的开源软件,包括对IoC和依赖注入的内置支持(这就是它内部连接的大部分内容),并在MIT许可下分发。

版本2.0已经稳定了一段时间,并且正在几个地方的生产中使用 - 最值得注意的是Huddle

在我看来,OpenRasta对资源的强烈关注意味着它比许多“多用途”Web / HTTP框架(包括WCF和ASP.NET MVC)更接近Roy Fielding最初的RESTful架构愿景。

答案 2 :(得分:7)

在做出任何决定之前,请注意WCF中的HTTP / REST支持正在发生重大变化。见http://wcf.codeplex.com/。将有大量的向后兼容性,但新的库是从HTTP和WCF的角度完全重写。

另请注意,OData虽然对特定的应用程序子集很有用,但它不是通用的REST框架。

如果您现在需要.net,并且您真的想要正确地执行REST,请查看OpenRasta。如果你只想做REST,因为它有很好的营销热点,那么ASP.NET MVC对你来说可能已经足够好了。如果您刚刚进入实验阶段,那么我将继续关注新的WCF库。

答案 3 :(得分:1)

我已经使用Visual Studio Extension Manager中提供的WCF Rest Service应用程序模板取得了很大成功。如果您希望快速入门,那就是我要去的地方。

答案 4 :(得分:1)

如果您的项目是在ORM框架之上构建的,或者您可以将所有数据保存在内存集合中,那么OData就是您的选择。如果没有(即通过存储过程或类似的方式获取数据),请转到WCF HTTP服务(a.k.a. WCF REST)

OData非常有前途,并且在IQueryable界面之上构建了极大的灵活性。实际上它就像RESTful LINQ。但是,除非你下面有一些ORM,否则你必须自己实现IQueryable,这几乎就像实现ORM一样。此时,您最好使用较低级别的WCF HTTP服务,它可以提供更多控制,您可以按照自己的方式调整资源。客户端库不会那么强大,但不会期望服务实现所有查询运算符。