刚刚在微软总部举行的互操作性活动(一个“互连测试大会(plugfest)”)上,即将发布的Sun Metro Web Services和.NET 3.5中的WCF间的互操作性令人印象深刻。InfoQ有幸就这个互操作性结果对Harold——Sun的企业Web服务互操作性工程负责人——进行了访谈。
针对事件使用原来的双向回调通常会引入发布者与订阅者的高度耦合。订阅者必须知道所有发布的服务在应用程序的位置,并连接它们。订阅者不能识别的发布者无法通知事件的订阅者。
在我的一本书《软件设计精要与模式》的第19章中介绍了职责链模式在实际项目中的应用,由于引入了该模式,使得对象在职责划分上有了更清晰的结构,然而由于项目场景的诸多限制,总有几分“为模式而模式”的生涩感觉。
自从WCF的Web编程模型的消息被首次公开,以及它在.NET Framework 3.5中的官方版本面世以来,开发人员能够获取到少量信息往往屈指可数。现在,Steve Maine提供了这方面资源的一个总结性列表。
NET Compact Framework 3.5 已经支持 Windows Communication Foundation (WCF)了,这是 .NET CF 3.5 最让人兴奋的特性之一。不过,.NET CF 版的 WCF 是 .NET Framework 3.5 版 WCF 的功能子集。
本文的主要内容是通过ASP.NET Ajax调用WCF(Windows Communication Foundation)服务的代码示例。(ASP.NET Ajax 1.0与3.5都可以调用)
NET Compact Framework 3.5 已经支持 Windows Communication Foundation (WCF)了,这是 .NET CF 3.5 最让人兴奋的特性之一。不过,.NET CF 版的 WCF 是 .NET Framework 3.5 版 WCF 的功能子集。
相对以往“原始”的HTML、CSS的开发方式,Silverlight拥有.NET核心中专用的CLR部分和富客户端开发所需的基本框架,同时微软还专门针对媒体(及其数字媒体权限管理)提供必要的开发支持。设计和开发人员将从多方面获益:
异常消息与特定技术有关,.NET异常同样如此,因而WCF并不支持传统的异常处理方式。如果在WCF服务中采用传统的方式处理异常,由于异常消息不能被序列化,因而客户端无法收到服务抛出的异常
若要公开WCF服务,需要提供一个运行服务的宿主环境。就像.NET CLR需要创建宿主环境以托管代码一般,WCF的宿主环境同样运行在进程的应用程序域中。
异常消息与特定技术有关,.NET异常同样如此,因而WCF并不支持传统的异常处理方式。如果在WCF服务中采用传统的方式处理异常,由于异常消息不能被序列化,因而客户端无法收到服务抛出的异常,例如这样的服务设计:
在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList<TDetail> DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList)。
在我们看来,Service Orientation提供了一种对业务、功能进行分解的方式。针对SO,我们把一个具体的业务流程或者一个复杂的功能分解成一个个独立完成某项任务的子单元,这些子单元通过一个个Service来承载。
通过第一部分的介绍,我们可以体会到,WCF 的Data Contract在CLR Type和Neutral Contract之间搭建了一座桥梁,弥合了.NET世界和厂商中立世界的差异。
WCF 与Web Service不同的是,当我们定义了服务契约的操作时,不管是通过ChannelFactory创建服务代理对象,还是通过SvcUtil的默认方式生成服务代理对象,客户端在调用这些代理对象时,都无法直接实现异步方式的调用。例如,对于如下的服务操作定义:
WCF 内置了很多Binding,而很多Binding其实主要是TransportElement 和 EncodingElement以及一些额外特性(比如安全,可靠消息传递等)的组合。
WCF支持对Stream对象的操作,尤其对于传递size过大的消息而言,如要考虑传递消息的效率,WCF推荐通过Stream进行操作。