WCF与ASP.NET Web API的区别

502

我花了几个月的时间来理解 WCF 的概念,最近我开发了我的第一个 WCF 服务应用程序。

我在努力理解配置文件中的所有设置。
虽然我不确定它是否适合环境,但似乎你可以用它实现很多神奇的事情。

前几天我发现 Microsoft 推出了一种新的东西,叫做 ASP.NET Web API

据我所知,这是一个非常容易使用和实现的RESTful 框架

现在,我正在尝试弄清楚这两个框架的主要区别,以及是否应该将我的 WCF 服务应用程序转换为新的 API。

请问有人可以帮我理解每个框架的区别和用法吗?


14
+1 有趣的问题。也许你可以在http://programmers.stackexchange.com/获得好的回答。 - Mithir
1
你正在使用“旧版”WCF的哪些功能?你是想构建一个RESTful API吗?还是RPC,或者SOAP? - marcind
1
@marcind:感谢您的回答。它主要是RESTful调用,没有RPC。 - LeftyX
4
另一个好的答案可以在https://dev59.com/X2kw5IYBdhLWcg3wmruH#9859981找到。 - user456814
1
两者本质上是相同的,但旧的区别在于WCF主要用于局域网,而WebAPI用于互联网。当然,我们也可以将WCF变成RESTful!基本上两者都是基于HTTP协议运行的。 - Mysterion
11个回答

253

对我们来说,WCF用于SOAP协议,而Web API用于REST。我希望Web API也支持SOAP。我们没有使用WCF的高级功能。这是来自MSDN的比较:

输入图像描述


1
Web API支持OData,对于CSOM来说简直是救星。 - jmbmage
12
微软有这么多东西,但其实并没有什么值得一提的。例如,WCF 支持 JSON,但在这个“比较”中,这个信息被隐藏得很好,而 WebApi 则在文字上不止一次地表明支持 JSON。请注意保持原文意思不变,并尽可能让翻译更通俗易懂。 - magallanes
1
这个表格没有意义。"JQuery"(大写字母J加引号)是一种协议和/或格式吗? - hyankov
1
有趣。MSDN在提到HTTP作为传输协议时是错误的。HTTP是一个应用层协议。 - RayLoveless

192
新的ASP.NET Web API是之前WCF Web API项目的延续(尽管一些概念已经改变)。
WCF最初是为了启用基于SOAP的服务。对于更简单的RESTful或RPCish服务(考虑像jQuery这样的客户端),ASP.NET Web API应该是一个不错的选择。

39
另外:尽管WCF提供了一些编写REST风格服务的支持,但ASP.NET Web API对REST的支持更加完整,并且所有未来的REST功能改进都将在ASP.NET Web API中实现。 http://msdn.microsoft.com/zh-cn/library/jj823172.aspx - Ohad Schneider
7
实际上,WCF最初被创建是为了在SOAP或RPC服务与客户端之间实现一个抽象层。重点是创建一个单一的架构(ABC),将这两种非常不同的调用进行处理,并通过配置文件来处理其内部实现。 - Scott Marcus
5
ASP.NET Web API 的真正缺点在于其客户端工具。Visual Studio支持集成工具以支持无缝WCF服务客户端实体和服务生成,而Web API中则没有此支持。我知道有 HttpClient 这个很棒的东西,但它不负责实体生成和序列化/反序列化。 - Shimmy Weitzhandler
2
@Shimmy Swagger 生成服务怎么样? - Alex78191
2
@Alex78191 感谢您的回复。生成的实体是否可以发出 INotifyPropertyChanged 客户端实体?验证方面如何? - Shimmy Weitzhandler

80

ASP.net Web API 的主要特点是基于 HTTP 和 REST 的 GET、POST、PUT、DELETE 请求方式,采用 ASP.net MVC 编程风格,并支持返回 JSON 数据。Web API 适用于轻量级处理和纯粹基于 HTTP 组件的开发。即使是单个简单的 Web 服务,使用 WCF 也会带来很多额外的负担。对于需要进行 Ajax 或动态调用的轻量级简单服务,WebApi 可以完美满足需求。它可以非常好地与 ASP.net MVC 并行使用。

请查看 Scott Hanselman 的 Hanselminutes Podcast 264 - This is not your father's WCF - All about the WebAPI with Glenn Block 以获取更多信息。


69
在下列情境中,您应该选择WCF:
  1. 如果您需要使用TCP、MSMQ或MIME等协议发送数据
  2. 如果消费方只能处理SOAP消息
WEB API是一个用于开发RESTful/HTTP服务的框架。
对于那些无法理解SOAP的客户端(如浏览器、HTML5),WEB API是一个好的选择。
HTTP服务标头指定了如何保护服务、如何缓存信息、消息正文的类型,而HTTP正文可以指定任何类型的内容,如HTML,而不仅仅是SOAP服务中的XML。

7
这句话的前提是WCF只能处理SOAP消息,这种假设是不正确的。你也可以在WCF服务中公开REST端点。我会修改它的说法,如果你不打算使用WCF的功能(参见tridy的留言),那么Web API是有意义的。 - Mike
3
没错,WCF也支持Restful API。基本上,Web API是WCF功能的一个子集,适用于简单的CRUD数据应用程序。 - user1496062

45

使用过WCF和Web API,我发现两者之间有很多差异。这两种技术栈都适用于不同的场景,因此无法说哪个更好,这取决于配置和情境。

Properties              ASP.Net Web API                         WCF
--------------------------------------------------------------------------------------------------
End point (mainly)      Http based                              SOAP based
Service Type            Front End                               Back-end
Support                 caching, compression, versioning        No
Framework               ASP.net                                 WCF
Orientation             Resource Oriented                       Service Oriented
Transports              http                                    http, tcp, MSMQ, Named pipe
Message pattern         Request reply                           request Reply, one way, duplex
Configuration overhead  Less                                    Much
Security                lesser than WCF (web standard security) Very high (WS-I standard)
Hosting                 IIS                                     IIS, Windows Service, Self hosting
Performance             Fast                                    A bit slower than Web API
In use from             .NET 4.0                                .NET 3.5

注意:这些数据不仅仅是我的观点,它们也来自其他官方网站的收集。


13
Web服务API也可以自托管(使用Owin/Katana),也可以在Windows服务中运行。 - Monis Iqbal

34

WCF提供了很多开箱即用的功能,这些功能无法与任何其他东西相比。除非您希望自行实现(例如)身份验证、授权、加密、排队、限流、可靠消息传递、日志记录、会话等功能。WCF不仅仅是Web服务;WCF是面向服务架构(SOA)的开发平台。


11
如果我没记错的话,我认为 WEB API 也提供了你列出的大部分功能。 - Alex
4
Web API 并不提供这些功能,或者提供的只是非常简单的版本。 - user1496062
3
那它到底提供还是不提供给他们呢? - user1017882
5
关于认证和授权,请查看http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api。简而言之,在IIS中它绝对支持。关于加密,您可能需要使用SSL,ASP.NET自然处理排队(但这基于可用的工作线程与传入请求之间的直接关系)。会话存在(但我从不建议直接使用会话)。日志记录很容易设置(通过ActionFilters或类似方式)。可靠消息的替代方案是使用SignalR(尽管不完全相同)。 - James Haug
7
“Not comparable to anything”?不太可能。 - bbsimonbb

19

为什么我在回答这个问题:

我花了很多时间才理解了这两种技术的区别。我会在这里列出所有那些我认为“如果当我在寻找答案的时候有这些要点,那么我会更早地选择我需要的技术”的要点。

信息来源:

Microsoft® Visual Studio® 2015 Unleashed

ISBN-13: 978-0-672-33736-9 ISBN-10: 0-672-33736-3

为什么选择ASP.NET Web API和WCF:

在比较ASP.NET Web API和WCF技术之前,重要的是要了解实际上有两种创建Web服务的样式/标准:REST(表现层状态转移)和SOAP/WSDL。 SOAP/WSDL是最初构建Web服务的标准。然而,它很难使用,并且具有影响性能的笨重消息格式(如XML)。基于REST的服务很快成为替代方案。它们更易于编写,因为它们利用HTTP的基本结构(GET、POST、PUT、DELETE),并通常使用较小的消息格式(如JSON)。因此,基于REST的HTTP服务现在是严格针对Web的服务的标准。

让我们定义ASP.NET Web API的目的

ASP.NET Web API是微软用于开发基于REST的HTTP网络服务的技术。(它早已取代了基于SOAP/WSDL的Microsoft ASMX。)Web API使编写基于HTTP协议的健壮服务变得容易,所有浏览器和本地设备都能理解。这使您能够创建服务来支持您的应用程序,并从其他Web应用程序、平板电脑、移动电话、个人计算机和游戏机中调用它们。今天撰写的大多数应用程序都以某种方式利用HTTP服务,以利用无处不在的Web连接。

现在让我们定义WCF的目的:

跨互联网通信并非总是最有效的方法。例如,如果客户端和服务都存在于相同的技术上(甚至是同一台机器上),它们通常可以协商出更有效的通信方式(如TCP/IP)。服务开发人员发现自己正在做他们试图避免的相同选择。现在他们必须在创建高效的内部服务和拥有Internet广泛访问之间做出选择。而且,如果他们必须同时支持两者,他们可能必须创建多个版本的服务或至少分离代理来访问他们的服务。这是微软用WCF解决的问题

使用WCF,您可以创建服务而不必担心边界问题。然后,您可以让WCF根据调用客户端的最有效方式来运行您的服务。为了管理此任务,WCF使用端点的概念。您的服务可能具有多个端点(在设计时间或部署后配置)。每个端点指示服务如何支持调用客户端:通过Web、通过远程过程调用、通过Microsoft Message Queuing(MSMQ)等。WCF使您专注于创建服务功能。它会自动处理与调用客户端的通信方式,以实现最高效的通信。因此,单个WCF服务可以有效地支持许多不同类型的客户端。
WCF的示例:
考虑以下示例:
客户数据在应用程序之间共享。每个应用程序可能在不同的平台上编写,并且可能存在于不同的位置。您可以将客户端口提取到WCF服务中,以提供对共享客户数据的公共访问。这样可以集中数据,减少重复,消除同步问题并简化管理。此外,通过使用WCF,您可以配置服务端点以按照调用客户端的方式工作。图显示了先前的示例,其中客户数据在WCF服务中进行了集中访问。

This is how WCF serves different clients

结论:

i) 何时选择Web API:

毫无疑问,基于REST的HTTP服务(如使用ASP.NET Web API创建的服务)已成为构建Web服务的标准。这些服务为构建服务的Web开发人员提供了一种简单直接的方法。Web开发人员了解HTTP GET和POST,因此很容易适应这些类型的服务。因此,如果您正在编写严格针对HTTP服务,ASP.NET Web API是合乎逻辑的选择。

ii) 何时选择WCF:

当您需要支持基于不同协议和消息格式的多个服务端点时,WCF技术非常有用。像Microsoft BizTalk这样的产品利用WCF创建强大的服务,这些服务可以通过Web以及不同的机器配置使用。然而,如果您需要编写一个应用程序,在连接到本地网络时通过TCP/IP进行通信,并在离开网络时通过HTTP工作,则WCF是您的答案

请注意:

Web开发人员通常认为WCF更难以开发和复杂。因此,如果您不预见需要多协议服务,您可能会坚持使用ASP.NET Web API。


1
请不要在多个问题中添加相同的答案。请回答最好的一个,并标记其他重复的答案,一旦您获得足够的声望。如果它不是重复的,那么请根据问题调整帖子并标记为未删除。 - Bhargav Rao

12

MSDN上有一篇关于这个问题的比较文章。

WCF和ASP.NET Web API

对我来说,选择的关键在于客户端是谁,以及他们位于何处?

在公司网络内,并且使用基于.NET的客户端:使用带有TCP绑定的WCF(比HTTP通信更快)。

在公司网络之外,并且使用多种技术,如PHP、Python等:使用支持REST的Web API。


10

在业务交流上,WebApi缺乏WSDL,因此开发人员应该手动记录所有内容。例如,如果WebApi操作返回对象列表,则客户端应手动创建对象,即WebAPI真的容易出现定义错误。

Webapi的优点是比WCF更轻便。


3
WCF是指Windows通信基础 (Windows Communication Foundation),而WS-* 是一组基于Web服务的标准协议。WebAPI则是指使用REST架构风格实现的Web服务接口。 - BozoJoe

7

关于"WebApi缺少WSDL"的说法,有几种方法可以生成Rest客户端。其中一种流行的方法是使用Swagger UI / (Swashbukkle Nuget)。这提供了一个丰富的界面来理解REST终点的输入和输出模式,并提供在线工具来测试终点。

JSON LD(Json Linked Documents)是另一个新兴的标准,通过提供更好的语义来公开JSON模式,进一步改善基于JSON的REST开发者体验。


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