关于Web服务:WCF是提高标准还是提高复杂性级别?

关于Web服务:WCF是提高标准还是提高复杂性级别?

Does WCF raise the bar or just the complexity level?

我了解WCF提供的三部分服务/主机/客户端模型的价值。但是,仅仅是我还是WCF似乎采取了一些直接而直接的方法(ASMX模型)并弄得一团糟?

除了使用SvcUtil的命令行后退一步来生成代理之外,还有其他方法吗?通过ASMX服务,自动提供了测试工具。今天使用WCF有什么好的选择吗?

我感谢WS *与WCF紧密集成,并希望在那里找到WCF的回报,但是请稍等一下,否则我会感到困惑。

而且,可用于WCF的书籍充其量只能说是糟糕透顶。 Juval Lowy是一位出色的作家,他写了一本很好的O'Reilly参考书" Programming WCF Services",但对于现在学习使用WCF来说(无论如何对我来说)做得并不多。那本书的前身(是一个更好的组织,但作为一个教程却不多)是Michele Leroux Bustamante的Learning WCF。它有很多优点,但是过时了,相应的网站也消失了。

除了继续使Google脱颖而出之外,您是否还有很好的WCF学习参考资料?


好的,我们开始。首先,Michele Leroux Bustamante的书已针对VS2008更新。该书的网站没有消失。现在就开始了,它包含大量的WCF信息。在该网站上,她为书中的所有示例提供了与VS2008兼容的更新代码。如果您从亚马逊订购,您将获得更新的重印本。

WCF不仅是ASMX的替代品。当然,它可以(并且做得很好)代替ASMX,但是真正的好处是它可以使您的服务成为自托管的。 WSE的大多数功能从一开始就已经具备。该框架是高度可配置的,并且通过多种协议为多个端点提供服务的能力非常出色,IMO。

虽然您仍然可以通过"添加服务引用"选项生成代理类,但这不是必需的。您真正要做的就是复制ServiceContract接口,并告诉代码在哪里可以找到服务的端点,仅此而已。您可以使用很少的代码从服务中调用方法。使用此方法,您可以完全控制实现。无论选择哪种方法生成代理类,Michele都会在这方面的出色网络广播中同时显示和使用这两种方法。

Michele那里有很多很棒的资料,我建议您查看她的网站。在学习WCF时,以下一些链接对我非常有用。我希望您能认识到WCF到底有多强大,以及实现起来多么容易。学习曲线有些陡峭,但是您的时间投入所带来的回报是值得的:

  • 米歇尔(Michele)的网络广播:http://www.dasblonde.net/2007/06/24/WCFWebcastSeries.aspx
  • Michele的图书网站(针对VS2008进行了更新):http://www.thatindigogirl.com/

我建议您至少观看Michele的网络广播之一。她是一位非常有效的演示者,在WCF方面,她显然学识渊博。她从根本上揭开了WCF的内部运作神秘面纱。


我通常使用Google查找WCF答案,并通常在以下博客中找到自己:

包含有价值的WCF文章的博客

  • http://blogs.msdn.com/drnick/default.aspx
  • http://blogs.msdn.com/wenlong/default.aspx
  • http://blogs.thinktecture.com/buddhike/
  • http://www.dasblonde.net/default.aspx

我发现的其他有价值的文章

  • http://blogs.conchango.com/pauloreichert/archive/2007/02/22/WCF-Reliable-Sessions-Puzzle.aspx
  • http://blogs.msdn.com/salvapatuel/archive/2007/04/25/why-using-is-bad-for-your-wcf-service-host.aspx

我很难确定何时应该使用WCF。为什么?因为我将生产力和简单性放在了首位。为什么ASMX模型如此成功,因为它可以工作,而且您可以快速工作。在VS 2005和.NET 2.0中,wsdl.exe吐出了非常不错且合规的服务。

在现实生活中,您的体系结构中应该只有很少的通信协议。这使其易于维护。如果您需要使用旧系统,请为它们编写特定的适配器,以便它们可以在漂亮而又漂亮的SOA世界中使用。


WCF比ASMX强大得多,它以多种方式对其进行了扩展。 ASMX仅限于HTTP,而WCF可以使用多种协议进行通信(当然,HTTP仍然是大多数人使用它的方式,至少对于需要互操作的服务而言)。 WCF也更容易扩展。至少可以通过无法扩展ASMX的方式对其进行扩展。"简单"可能正在扩展它。 =)

在我看来,WCF提供的附加功能远远超过它所添加的复杂性。我也觉得编程模型更容易。例如,DataContracts比必须使用具有公共属性的XML序列化进行序列化要好得多。它在本质上也更具声明性,这也很好。


等等...。您曾经使用过.NET Remoting吗,导致多数民众赞成在取代它。 .NET Remoting本身非常复杂。我发现WCF更容易且布局更好。


我看不到它经常被提及,但是您仍然可以使用WCF实现相当简单的服务,与ASMX服务非常相似。例如:

1
2
3
4
5
6
7
8
9
10
11
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SimpleService
{
    [OperationContract]
    public string HelloWorld()
    {
        return"Hello World";
    }

}

您仍然必须在web.config中注册端点,但这还不错。

消除分离的数据,服务和操作合同的冗长性对于使WCF对我来说更易于管理大有帮助。


VS2008包括"添加服务引用"上下文菜单项,该菜单项将在后台为您创建代理。

如前所述,WCF不仅旨在替代ASMX Web服务类型,而且还为所有可互操作的服务提供一致,安全和可扩展的方法,无论是通过HTTP,TCP,命名管道还是MSMQ传输。

我承认我确实还有WCF的其他问题(例如,在通过basicHTTP公开服务时重写方法签名-请参阅此处,但总的来说我认为这是绝对的改进)


如果您使用VS2008并创建WCF项目,则在单击运行/调试时会自动获得测试工具,并且可以添加引用,而不必使用svcutil。


WCF替代了Microsoft的所有早期Web服务技术。它的功能还远远超出了传统上所谓的" Web服务"。

WCF" Web服务"是通过WCF启用的更广泛的远程通信范围的一部分。与通过传统的ASMX相比,在WCF中做事的灵活性和可移植性要高得多,因为WCF是从头开始设计的,旨在总结Microsoft提供的所有不同的分布式编程基础结构。 WCF中的端点可以通过SOAP / XML进行通信,就像通过TCP / binary一样容易地进行通信,而更改此媒体仅是配置文件mod。从理论上讲,这减少了在移植或更改业务需求,目标等时所需的新代码量。

ASMX is older than WCF, and anything ASMX can do so can WCF (and more)。基本上,您可以看到WCF试图在逻辑上将Microsoft应用程序中使两个应用程序进行通信的所有不同方式组合在一起; ASMX只是众多方式中的一种,因此现在被归类为WCF的功能范围。

Web服务只能通过HTTP进行访问,并且可以在无状态环境中使用,因为WCF可以在不同类型的应用程序中托管,因此WCF十分灵活。托管WCF服务的常见方案是IIS,WAS,自托管,托管Windows服务。

主要区别在于Web服务使用XmlSerializer。但是WCF使用的DataContractSerializer与XmlSerializer相比在性能上更好。

在什么情况下必须使用WCF

  • 处理业务交易的安全服务。一项服务
  • 向其他人提供当前数据,例如路况报告或其他
  • 监控服务。允许两个人聊天的聊天服务
  • 实时交流或交换数据。仪表板应用程序
  • 轮询一个或多个服务以获取数据并以逻辑方式呈现
  • 介绍。公开使用Windows工作流程实现的工作流程
  • 作为WCF服务的基础。一个Silverlight应用程序来轮询
  • 最新数据提要服务。

WCF的功能

  • 服务定位
  • 互通性
  • 多种消息模式
  • 服务元数据
  • 数据合约
  • 安全
  • 多种传输和编码
  • 可靠且排队的消息
  • 持久消息
  • 交易次数
  • AJAX和REST支持
  • 可扩展性

来源:主要文字来源


我最初对WCF的想法是完全一样的!以下是一些解决方案:

  • 使用泛型对自己的代理/客户端层进行编程(请参阅类ClientBase,Binding)。我发现这很容易上手,但是很难完善。
  • 使用第三方实现1(我目前最喜欢SoftwareIsHardwork)

  • 我相信WCF确实可以从许多方面推动ASMX Web服务的实现。首先,它提供了一个非常好的分层对象模型,可以帮助隐藏分布式应用程序的内在复杂性。
    其次,您不仅可以使用请求-重放消息传递模式,包括从服务器到客户端的异步通知(纯HTTP不可能),其次,可以从XML消息传递中抽象出底层的传输协议,从而优雅地支持HTTP,HTTPS,TCP等。与"第一代" Web服务的向后兼容性也是一个加号。
    WCF使用XML标准作为内部表示格式。这可能被视为有利或不利,尤其是随着诸如JSON之类的" XML的无脂肪替代品"的日益普及。


    MSDN?我通常会对Library参考本身做得很好,而且通常希望在那里找到有价值的文章。


    我发现使用WCF的困难之处在于管理客户端和服务器的配置,以及对不太好的故障状态异常进行故障排除。

    如果有人有任何快捷方式或提示,那就太好了。


    就其提供的功能而言,我认为答案是兼容性。 ASMX服务非常Microsofty。并不是说他们没有尝试与其他消费者兼容。但是除了ASP.NET网页和其他一些自定义的Microsoft使用者之外,该模型的适用性并不高。而WCF由于其体系结构而使您的服务具有基于开放标准的端点,例如除了常用的SOAP之外,还包括REST,JSON等。与ASMX相比,其他人使用WCF服务的时间可能要容易得多。

    (这基本上是从MSDN比较阅读中得出的,因此,了解更多的人应该随时纠正我。)


    我发现这很痛苦;因为我在两端都有.NET,在两端都加载了相同的"合约" dll等。但是随后,我不得不处理很多细节,例如" KnownType"属性。

    在更改大量配置之前,WCF还默认只允许1个或2个客户端连接到服务。从代码中更改配置并不容易,运送大量的comfig文件不是一种选择,因为将我们的更改合并到客户在升级时可能已进行的更改中太难了(同样,我们不希望客户使用WCF设置!)

    .NET远程处理通常在大多数时间都有效。

    我认为尝试假装.NET到.NET基于对象的通信与将Text(xml)发送到未知系统相同,这是一个太远的步骤。

    (有几次我们使用WCF与Java系统进行通信,我们发现Java系统发出的XSD始终与它想要的XML不匹配,因此必须手动编码许多XML映射。)


    WCF不应被视为ASMX的替代品。从它的位置和如何在Microsoft内部使用来看,它实际上是用于任何类型的跨边界通信的基本体系结构。


    推荐阅读