WCF和ASMX Web服务有什么区别?

388

我非常困惑WCF和ASMX Web服务之间的区别。在早期阶段,我使用了很多Web服务,现在引入了一个叫做WCF的新东西。我仍然可以创建作为Web服务运行的WCF。我认为WCF中将会有更多的东西。

WCF和Web服务有何区别?应该在什么情况下使用它们?


7
这不是一个推荐问题,ASMX和WCF都不是产品,它们是Microsoft技术栈中网络服务的两个迭代版本。这个问题是在问它们之间有什么区别,并且学习新的值得吗?这与“我应该使用Telerik控件还是Infragistics”不同。 - John Saunders
5个回答

403

Keith Elder在这里很好地比较了ASMX和WCF。看一下吧。

另一个关于ASMX和WCF的比较可以在这里找到 - 我不完全同意那里的所有观点,但它可能会给你一个想法。

WCF基本上是“ASMX的类固醇版” - 它可以做到ASMX能做的所有事情 - 还有更多!

ASMX是:

  • 易于编写和配置
  • 仅在IIS中可用
  • 只能从HTTP进行调用

WCF可以:

  • 托管在IIS、Windows服务、Winforms应用程序、控制台应用程序中 - 您拥有总体自由度
  • 使用HTTP(REST和SOAP)、TCP/IP、MSMQ和许多其他协议

简而言之:WCF已完全取代ASMX。

查看MSDN上的WCF开发人员中心

更新:链接似乎已失效 - 尝试这个:什么是Windows Communication Foundation?


17
使用 Visual Studio 2010 .NET 4.0,编写 WCF 和 ASMX 一样容易。现在已经没有使用 ASMX 的借口了。WCF 更快、更灵活、更安全,ASMX 已经过时了,没有人应该再编写它。 - Tom Stickel
15
大多数开发人员错误地认为ASMX需要IIS,毕竟这是他们所见过的唯一用例。但事实上,ASMX与IIS没有任何技术依赖关系。 - MrNick
2
@MrNick:没错。虽然没有IIS,但仍然只有HTTP,比较一下托管ASMX服务的代码和托管WCF服务的代码。 - John Saunders
2
很遗憾,链接http://keithelder.net/2008/10/17/wcf-vs-asmx-webservices/已经失效。 - Robert
2
@codemonkeyliketab:这个回复已经超过6年了 - 在互联网时代已经是光年之遥!我尝试寻找WCF开发者中心的替代方案 - 请看我的更新。 - marc_s
显示剩余2条评论

36

ASMX Web服务只能通过HTTP(传统的.asmx Web服务)调用。而WCF服务或WCF组件可以通过任何协议(如http、tcp等)和任何传输类型调用。

其次,ASMX Web服务不够灵活。然而,WCF服务是灵活的。如果您创建了一个新版本的服务,则只需公开一个新端点。因此,服务具有敏捷性,这是一个非常实用的方法,考虑到当前的业务趋势。

我们将WCF开发为合同、接口、操作和数据合同。作为开发人员,我们更专注于业务逻辑服务,不需要担心通道堆栈。WCF是一种统一的编程API,可用于任何类型的服务,因此我们创建服务并使用配置信息设置通信机制,如HTTP/TCP/MSMQ等。


12
也许只是我的感觉,但第2段和第3段似乎充满了营销用语。 - Victor Zakharov
@网络专家们,你们说“如果你制作了服务的新版本,那么你只需要暴露一个新的端口”,你们想表达什么意思? - Mou
@Mou,他的意思是暴露一个新的“端点”吧。就像 <endpoint address="http://api.microsofttranslator.com/V1/soap.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_LanguageService1" contract="TranslatorService.LanguageService" name="BasicHttpBinding_LanguageService3" /> 这样。 - AlexMelw

25
这是一个非常古老的问题,但我觉得 ASMX 的好处还没有得到公正的评价。虽然不是非常灵活,但 ASMX Web 服务非常简单易用。而 WCF 更加灵活,但启动和配置也更加复杂。ASMX Web 服务准备就绪,并且在您添加文件后,可以立即作为 Web 服务引用添加。(假设项目构建成功) 对于 "创建 Web 服务" -> "运行 Web 服务" -> "添加 Web 服务引用" 的简单开发流程,ASMX Web 服务很少出错,您也很难配置错误,这就是它的优点。对于那些声称 WCF 取代了 ASMX 的人,我要回答说,WCF 需要添加一种简化的 K.I.S.S. 配置模式才能完全取代 ASMX。以下是 ASMX Web 服务的示例 web.config 文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings />
  <system.web>
    <compilation targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
</configuration>

10
@Coder1409 嗯,肯定需要更多的配置,因为一些东西需要进行配置,比如绑定、可发现性等。在asmx中这些都不是必需的,例如服务契约、操作契约、数据契约和数据成员也都不是必需的。当然,这些是WCF更强大的原因,但否认它增加了复杂性就不太诚实了。说没有缺点有点牵强。 - Andrew Hoffman
Andrew,你应该尝试在.NET 4.0或4.5中创建一个简单的“hello,world”WCF服务。几乎没有任何配置。在4.0中更改了配置,因此默认生成的配置文件不会配置默认值,并且有不同绑定的默认值集。因此,如果您创建了一个basicHttpBinding服务,则在配置文件中几乎找不到任何内容。 - John Saunders
8
第一(第二、第三……)次创建 WCF 时,我花了很长时间才弄清楚所需的配置。我一直在问自己:“我为什么需要这样做?”“为什么要麻烦自己使用如此复杂的东西?”ASMX 就可以立即使用。因此,说它同样简单是不正确的。总有一天我会完全理解并改变我的观点——在那一天之前,我会很生气! - tomjm
1
@tomjm 再试试使用现代版本的 Visual Studio 和 .NET。除其他外,配置系统已更改为默认更多设置。特别是,您几乎不需要做更多的工作,只需指定URL即可获得一个简单的 Web 服务(仅限 http),没有任何功能。 - John Saunders
1
@tomjm 嗯,这很好知道。老实说,以前需要配置的东西太多了,所以使用一个 WCF 配置管理应用程序是有意义的。它可以做任何事情!(除了在某些良好的默认设置下开箱即用)然而,现在我们更简单地考虑 WEB 服务。WCF 对于高级服务仍然非常棒,但是...我认为,大多数服务开发都是 Web 服务开发,难以击败 WebAPI2。 - Andrew Hoffman
显示剩余2条评论

12

WCF 完全替代了 ASMX Web 服务。ASMX 是以前的 Web 服务处理方式,而 WCF 是现在的 Web 服务处理方式。所有新的 SOAP Web 服务开发,无论是在客户端还是服务器端,都应该使用 WCF。


32
麻烦在于,虽然ASMX是一个简单的模型(意味着不是非常灵活),但它也是一个简单易用、大多数网络服务需求容易理解的模型。WCF增加了许多额外的复杂性。虽然微软想要用WCF取代ASMX,但似乎有些人对此有所抵制,直到微软将最常见的情况变得像旧的[Webmethod]方式一样简单为止。 - mattmc3
6
WCF其实并不复杂。你可以尝试创建一个简单的“Hello World”网络服务,然后比较一下在两种方式下你需要编写的代码量。答案是:无论哪种方式都不需要编写太多代码,而在WCF中稍微多一点。另外,顺便提一下,ASMX已经被WCF替代了,这已经是既定事实。 - John Saunders
60
WCF一点也不复杂。 哈。告诉那个话过头的web.config吧。 - mattmc3
27
我不是一个投票者,但我会告诉你为什么 - 因为“这是新的,那是旧的”并不是任何人都应该关心的重要区别。我们选择工具并不仅仅基于它们的年龄 - 锤子非常古老,但它通常仍然是敲钉子最好的工具。所以,你给出了一个有效的答案,只是不是很有帮助 - 就像古老的“你在飞机上”的笑话一样。 - Jasmine
5
被踩 - 没有参考资料。您是如何得知这个信息的?这是个人观点吗?您在Microsoft工作吗?添加参考资料,我会点赞。 - tomjm
显示剩余11条评论

7
关于asmx web服务与WCF的简单性,有很多讨论。让我在这里澄清一些观点。
  • 确实,新手Web服务开发人员可以轻松地开始使用asmx Web服务。Visual Studio为他们完成所有工作,并立即创建一个Hello World项目。
  • 但是,如果您学会了WCF(当然不需要花费太多时间),那么您会发现WCF也很简单,您可以轻松地继续前进。
  • 重要的是要记住,WCF中所说的这些复杂性实际上归因于它带来的美妙功能。配置文件中提到了寻址、绑定、契约和端点、服务和客户端等。美丽之处在于,您的业务逻辑被分离并安全地维护。明天,如果您需要将绑定从basicHttpBinding更改为netTcpBinding,您可以轻松地在配置文件中创建一个绑定并使用它。因此,所有与客户端、通信通道、绑定等相关的更改都应在配置中完成,从而使业务逻辑保持安全完整,这非常有意义。
  • WCF“Web服务”是通过WCF启用的更广泛的远程通信谱系的一部分。在WCF中执行操作比传统的ASMX更灵活、可移植性更高,因为WCF从根本上设计了所有由Microsoft提供的不同分布式编程基础设施的总结。在WCF中,一个端点可以通过SOAP/XML或TCP/binary进行通信,并且更改这个介质只是一个配置文件修改。理论上,在移植或更改业务需求、目标等方面,这减少了所需的新代码量。
  • Web服务只能通过HTTP访问,并且在无状态环境下工作,而WCF是灵活的,因为其服务可以托管在不同类型的应用程序中。您可以在Console、Windows Services、IIS和WAS中托管您的WCF服务,这又是在Visual Studio中创建新项目的不同方式。
  • ASMX比WCF旧,ASMX能做到的WCF也能做到(甚至更多)。基本上,您可以将WCF视为逻辑上将微软的所有不同应用程序之间互相通信的方法进行分组;ASMX只是其中的一种方法,因此现在被归为WCF功能的一部分。
  • 您始终会喜欢使用NET 4.0或4.5的Visual Studio,因为它在创建WCF服务时使生活变得容易。
  • 主要区别在于Web服务使用XmlSerializer。但是WCF使用的DataContractSerializer比XmlSerializer的性能更好。这就是为什么WCF比其他.NET通信技术(如asmx、.NET remoting等)表现得更好。

不要忘记我曾经是那些更喜欢asmx服务而不是WCF服务的人之一,但当时我对WCF服务及其能力并不了解。我害怕WCF配置。但我敢于尝试编写自己的几个WCF服务,当我学到更多关于WCF的知识后,现在我对WCF没有任何顾虑,并且我向任何人推荐使用它们。 祝编码愉快!


是的,我不同意WCF很简单,尤其是处理传入的XML。它非常适合处理JSON,但似乎在管理XML文档方面更加复杂。或者也许我错过了一些从未被问及或回答过的东西。 - PoloHoleSet

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