在 .NET 中开发新的 RESTful Web 服务——我应该从哪里开始? ASP.NET-MVC,WCF?
Posted
技术标签:
【中文标题】在 .NET 中开发新的 RESTful Web 服务——我应该从哪里开始? ASP.NET-MVC,WCF?【英文标题】:Developing a new RESTful web service in .NET -- where should I begin? ASP.NET-MVC, WCF? 【发布时间】:2011-01-17 03:34:12 【问题描述】:目标是构建一个服务,然后我将通过 jQuery 和基于标准的 Web 前端、移动设备“胖客户端”以及很可能是 WPF 桌面应用程序来使用该服务。
WCF 似乎是一个不错的选择,但我从未使用 WCF 构建过 RESTful 服务,所以我什至不知道该从哪里开始。
我正在考虑的另一个选项是使用 ASP.NET MVC,添加一些自定义路由,添加一些控制器操作并使用不同的视图来推送 JSON、xml 和其他返回类型。
这个项目主要是我自己的一个学习练习,我想花一些额外的时间“正确”地做它,这样我就可以更好地理解这些部分是如何组合在一起的。
所以我的问题是,我应该使用哪种方法来构建这个 RESTful 服务,这样做有什么好处?
【问题讨论】:
【参考方案1】:通常,对于任何类型的托管服务,我都会说 WCF,但在使用 JSON 作为序列化机制的 RESTful 服务的特定情况下,我更喜欢 ASP.NET MVC(其余部分我将其称为 ASP.NET这个答案)。
第一个原因是路由机制。在 WCF 中,您必须在合同上定义它,这一切都很好,但是如果您必须对路由进行快速更改,从我的角度来看,使用 ASP 中的路由机制来完成它们要容易得多。网。
此外,就上述而言,如果您在 WCF 中通过多个接口公开了多个服务,则很难获得 URL 结构的完整图像(这很重要),而在 ASP.NET 中,您(通常)拥有所有的路线分配在一个地方。
关于 ASP.NET 的第二件事是,您将可以访问 ASP.NET 众所周知的所有内在对象(请求、响应、服务器等),这在公开 HTTP 时是必不可少的- 特定端点(这是您正在创建的)。当然,您可以在 WCF 中使用许多相同的东西,但您必须明确告诉 WCF 您正在这样做,然后在设计您的服务时牢记这一点。
最后,通过个人经验,我发现DataContractJsonSerializer
不能很好地处理DateTimeOffset
值,它是您在使用服务时应该使用的类型而不是DateTime
(在任何端点),人们可以在多个时区调用。在 ASP.NET 中,您可以使用不同的序列化程序,或者如果需要,您可以创建自己的 ActionResult
,它为您使用自定义序列化程序。我个人更喜欢JSON.Net serializer。
我喜欢 JSON.Net 序列化程序和 ASP.NET 的优点之一是,如果你聪明的话,你可以使用匿名类型。如果您在非泛型类型上创建静态泛型方法,然后委托给内部泛型类型,则可以使用类型推断轻松地将匿名类型用于序列化返回值(假设它们是一次性的,当然,如果您有一个一致返回的结构,你应该定义它并使用它)。
还应该提到,如果开发 RESTful 服务,您不必完全打折 WCF。如果您要从服务中推送 ATOM 或 RSS 提要,那么 massive 的 System.ServiceModel.Syndication
命名空间中的类有助于构建和序列化这些提要。创建ActionResult
类的简单子类以获取SyndicationFeed
的实例,然后在执行ActionResult
时将其序列化到输出流中非常简单。
【讨论】:
我意识到它与原始问题无关,但您能否更详细地了解 DateTimeOffset 以及您在 JSON 序列化中看到的问题? @Nate:我建议将其作为一个单独的问题提出;测试您自己看到的差异,然后发布有关您看到的差异的问题。【参考方案2】:这是一个可以帮助您在 ASP.NET MVC 和 WCF 之间做出决定的想法。在您描述的场景中,您是否预计需要使用 HTTP 以外的协议?
WCF 被设计为与传输协议无关,因此它与 ASP.NET 非常不同。它具有通道和绑定、消息、服务合同、数据合同和行为。在构建分布式应用程序时,它提供的指导很少。它给你的是一个可以建立的干净的石板。
ASP.Net MVC 自然是一个基于 Http 的框架。它处理 HTTP 动词、媒体类型、URL、响应标头和请求标头。
问题是哪个模型更接近您要构建的模型?
现在你提到了 ReST。如果您确实想按照 ReST 约束构建分布式应用程序,那么您最好从 OpenRasta 开始。它会引导你走上这条路。
你可以在 ASP.Net MVC 中做 Rest,你可以在 WCF 中做,但是有了这些解决方案,你就不会落入成功的坑 ;-)
【讨论】:
我从来没有听说过 OpenRasta——你有任何关于它的额外信息吗?此外,HTTP 和/或 HTTPS 将是其中使用的唯一协议,因为我将在各种平台上开发“客户端”。 您将在这里找到主要项目trac.caffeine-it.com/openrastaserialseb 是该项目的主要开发人员,也是这里的频繁贡献者。如果您查看 Mix10,OpenRasta 上的演讲是 REST live.visitmix.com/Sessions#/tags/REST 类别下的唯一演讲 对于一个非常简单的项目,openrasta 与 asp.net mvc 之类的东西相比会不会过大?我已经对 asp.net mvc 和 WCF 非常熟悉,而且我不确定在这一点上学习一个全新的框架/工具包是否对我有利。想法? 考虑到您正在构建多个客户端,而不仅仅是基于浏览器的客户端,那么从长远来看,我建议 OpenRasta 将节省您的时间。【参考方案3】:就我个人而言,我并不热衷于在 WCF 中实现 REST 服务。我发现 asp.net mvc 框架是一个更自然的编程模型。
http://atomsite.net/的实现者最初在WCF中实现了atompub规范,然后使用asp.net mvc重写了整个服务。他的经历与我上面的评论相呼应,对于纯 REST 服务,asp.net mvc 是要走的路。
唯一的例外是如果我想以一种宁静和非宁静的方式潜在地公开服务。或者,如果我通过 REST 公开现有的 WCF 服务。
【讨论】:
以上是关于在 .NET 中开发新的 RESTful Web 服务——我应该从哪里开始? ASP.NET-MVC,WCF?的主要内容,如果未能解决你的问题,请参考以下文章
从 .net 标准库中读取 appsettings.json