技术开发 频道

《WCF本质论》作者访谈

  【IT168 评论】

  随着WCF 3.5的发布,微软修改了它的API、Web服务基础架构以及在Visual Studio 2008下的工具。Addison Wesley出版了《Windows Communication Foundation本质论》一书,作者为Steve Resnick、Richard Crane和Chris Bowen,旨在为开发人员提供一个紧密依赖于样例代码的路线图。

  下面是作者简短的问题解答:

  Q:从2.0发展到3.5,WCF的最大区别是什么?开发人员应该了解它们中的哪些内容?

  我将这些区别分为三类。第一类是对REST风格编程的支持,这种风格对开发人员来说比SOAP更加友好。在3.5中,WCF包含了URI模版,负责映射 Web地址和HTTP动词,这是为了实现JSON和RSS格式,以及实现二进制流。第二类则是WCF与.NET中的WF的集成。这一功能非常强大,因为 WCF和WF实际上就是一块硬币的两面:WCF是服务的接口和宿主环境,而WF则实现它的处理逻辑。WCF 3.5的第三个明显变化实际上是在Visual Studio 2008中,它提供了针对WCF的设计与调试工具。包含了用途广泛的WCF和WF模版,以及一些现有的工具,例如使用WcfSvcHost和 WCFTestClient可以简化测试。

  Q:在WCF 3.5中,你最感兴趣的新特性是什么?为什么?

  我想,WCF 3.5支持REST协议的方式实在是太酷了。为了弄清楚概念,我们可以看看SOAP和REST之间的显著区别。SOAP主要关注的是动作(动词),而 REST则面向的是实体(名词)。由于WCF采用的是“行为”的架构,因此在这两者之间切换时,并不需要做大的修改。我发现一个神奇之处就是,你可以在两个架构模型(REST vs. SOAP)之间切换,而应用程序中90%的代码都是完全相同的。

  Q:在设计和实现服务时,你对架构师和开发人员有什么指导意见?

  正如你需要对你的应用程序所支持的特性分优先级一样,你也应该对基础架构进行优先级的划分。例如,判断哪一个是最重要的……性能,可伸缩性,可管理性,互操作性,安全,还是上市时间?一旦你划定了优先级,再来看你的选择。对于每一项,都要选择最简单的选项以符合你的需求。如果你正在寻求标准的基于http 的访问,以及自定义(用户ID/密码)的授权机制,就可以使用basicHttpBinding,并采用IIS作为宿主。但如果你需要在一个内部网络中获得最好的性能,可以考虑使用Windows激活服务(在Windows 2008中)作为宿主,并选择netTcpBinding。此外,.NET 3.5提供了很棒的诊断工具。学习使用服务跟踪工具可以节省你的时间。

  Q:为什么开发人员要基于非SOAP的服务使用WCF,例如JSON和AJAX?

  WCF为服务提供了很好的支持,不管服务是通过SOAP还是其他协议公开。类似线程、实例化、审计、安全与托管等重要特性都不需要考虑协议。在3.5之前,通过AJAX应用程序访问一个WCF服务是相当困难的。但随着新版本提供的支持,同时又提供了大量可用的示例,实现就变得非常容易了。显然,简单的原因一部分是因为协议,而WCF提供的其他特性(线程、安全等)又为我们节省了时间。

  Q:在用于跟踪或调试WCF服务的工具中,你是否有自己喜爱的工具与社区分享?

  首先,在WCF中有一个内置的端对端的跟踪工具和日志记录工具,跟踪消息发送与接收的处理过程都会非常简单。还有一个查看器,可以展示过程中的每一步,甚至可以在检测到失败时用红色来标注相关的代码。服务配置编辑器(Service Configuration Editor)使得跟踪选项可以方便的启用或关闭。其次,你还可以使用性能计数器(performance counters)操作服务,这样就能够监视应用程序的关键特性。这不仅对于开发很有帮助,也十分有利于产品环境。最后,你还可以使用WCF Behaviors创建自己的审计工具与日志工具。你可以将日志记录到数据库,队列,或其他最合适的地方。

  Q:什么问题是你最常见的?你可否预先给出一个回答呢?

  每个人都会问到性能。当然这是一个复杂的话题,因为它要依赖于需要的特性而定!例如,如果你需要能够互操作的消息层的安全,你可以使用WS- Security、Text编码和HTTP以应对广泛的要求。它可以使用wsHttpBinding进行事先配置。另一方面,如果你要控制客户端、服务和网络,则可以使用二进制编码,并使用TCP协议。它可以使用netTcpBinding进行预先配置,并能够提高5倍的性能。而且这不需要修改任何代码。实例化同样如此。你是否需要让你的类是单线程的?或者允许WCF能够在同一时间有多个实例?处理后者的更好方式是并发。WCF通过 InstanceContext设置支持每种模型。而且,WCF提供了足够的灵活性以调整性能来符合你的需求。这实在是太酷了!

0
相关文章