【51CTO.com独家特稿】3月24日下午2:00到3:00,51CTO以及华章公司共同邀请张逸和赵劼两位老师,就“轻松掌握WCF 帮你找到入门砖”这一主题进行现场讨论,并回答网友在工作和学习中的难题。下面是本次嘉宾访谈的对话实录:
开场白
主持人: 现在两位老师已经来到了我们的聊天室,先给大家打个招呼!同时,也给大家先简单做下自我介绍吧!
张逸: 大家好!
张逸: 我是《WCF服务编程》的译者,对WCF有一定的经验,也曾利用WCF开发过一些项目,希望这次交流能够对大家学习WCF有一定的帮助。
赵劼: 大家好!我是个开发人员。平时对于.NET开发相关方面有比较大的兴趣,也投入了不少。主要“功绩”就在于写了一些技术文章。WCF目前已经是微软分布式通信的“事实标准”(已经有这个倾向了),对于这方面有需求的朋友了解一下WCF还是很重要的。
WCF简介
张逸:我先解释一下WCF是什么?
张逸: 严 格的说,WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。这些类通过一定方式被组织起来,共同协 作,并为开发者提供了一个统一的编程模式。WCF之所以特殊,是在于它所应对的场景与普通的.NET类库不同,它主要用于处理进程间乃至于机器之间消息的 传递与处理,同时它引入了SOA的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用。实际上,WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准。
主持人:您接触WCF有多长时间了呢?
张逸: 应该说,我从WCF的前身indigo开始,就对其产生了极大的兴趣,毕竟我最初使用.NET Remotin开发了一些项目,对分布式开发比较热衷于了解。
张逸: 从 WCF所处的位置来看,它是包含在.NET 3.0(也包括.NET 3.5)之中的。我们注意比较.NET 3.0与.NET 2.0,其实唯一的区别就是.NET 3.0包含了WCF、WPF、WF(或者还有CardSpace)而已。因此,我们认为WCF是.NET框架的一部分,似乎并不为过。尤为关键的 是,WCF并不能脱离.NET框架而单独存在(但非WCF客户端可以调用WCF服务),因此,虽然WCF是微软用以应对SOA解决方案的开发需求而专门推 出的,但它并不是例如Spring、Struts那样的框架,也不是像EJB那样的容器或者服务器。微软真正符合SOA企业应用服务器角色的,我想应该是 Biztalk Server。
现场问题解答
1、网友提问:学习WCF需要什么知识背景吗?
张逸: 学习WCF并不难,其实掌握.NET的基本知识就可以入手WCF了。当然,如果多了解有关分布式开发和SOA的相关知识,会比较容易理解其中的一些概念。
2、 网友提问:我在xbap里想调用WCF,用的是TCP/IP协议,但是权限被沙箱锁了,有什么办法可以实现调用WCF服务!?xbap的部署是部署到 IIS里的!!我在xbap里想调用WCF,用的是TCP/IP协议,但是权限被沙箱锁了,有什么办法可以实现调用WCF服务!?xbap的部署是部署到 IIS里的!!
赵劼: 关于XBAP的权限问题,这个和AJAX一样,因为要保证性能问题,因此运行在一个Security Sandbox。解决方法也和AJAX一样,用服务器端作代理即可。
赵劼: 解决XBAP的砂箱限制的方法,就是使用服务器端作为代理来访问WCF服务。
张逸: 同意老赵的观点。微软的技术都是如此,应用简单,深入则困难。因为微软的设计师们有一套化繁为简的本事。但若要理解如何化繁为简的,就需要你深入研究了。
赵劼: 简单的说,就是让您的XBAP程序请求您自己的某个资源(比如某个HttpHandler或WCF service),然后您的后台程序接收到请求后,再去请求您的目标服务,然后您的后台程序把结果返回给XBAP。
3、网友提问:为什么要用WCF,我初学,WCF有什么好处?
赵劼: WCF目前已经是微软分布式通信的“事实标准”(已经有这个倾向了),对于这方面有需求的朋友了解一下WCF还是很重要的。
张逸: 简单说,WCF就是将你提到的所有这些与服务相关、与分布式开发相关的微软技术集成在一起了。你用WCF可以解决以前需要多种技术才能实现的问题。
赵劼: 如果您的工作需要(也就是需要在.NET平台下使用分布式通信),自然学习WCF是不二的选择。
张逸: 如果你不打算开发企业应用程序,并且不会碰到互操作性的问题,同时不考虑可扩展性的要求,以及解决企业系统之间信息孤岛的问题,我觉得自然不必学习WCF。反过来说,上述的这些场景正是WCF的用武之地。
4、网友提问:弱弱地问:WCF程序编写起来容易吗?需要掌握什么样的基础?
张逸: 编写WCF程序非常容易,如果你只是WCF的应用者,只需要掌握一些WCF特有的attribute就可以了。
主持人:可以举例说明吗?
张逸: 例如[ServiceContract]、[DataContract]等。因为WCF的编程模式与传统的编程模式区别不大。这也是微软的一个良苦用心(也可以说是险恶用心:-)),这样就降低了学习者的技术门槛。
张逸: WCF的服务编程自然还是基于Windows平台的。
赵劼: 当然,这是微软技术的一贯特点,使用简单。但是如果要深入的话,还是要投入不少精力的。.NET 3.0中的部件是用于处理企业级需求的,由于业务各不相同,灵活多变,因此WCF的高级部分必然也会引入相当的复杂度和灵活度。
5、网友提问:WCF里的remoting的性能比.net 2.0的remoting的性能好要很多吗?
张逸: 不知老赵有没有对性能进行过测试,坦白说,我没有对.NET Remoting和WCF进行性能的比对,这个问题不能贸然回答,呵呵!
赵劼: 我没有做过系统的性能测试,但是微软官方曾经发布过一篇白皮书,表示在同样(或类似)的协议下,WCF的性能普遍优于.NET之前的分布式通信解决方案。我相信NetTcpBinding性能优于.net Remoting。
6、网友提问:可否举一个现实中的例子来说明什么样的需求,使用WCF解决更好?
赵劼: 关于“什么样的需求,使用WCF解决更好”,感觉不是很好回答。
其实WCF其实也已经逐渐成为.NET下分布式通信的标准技术了。如果您有这方面需求自然需要学习。例如:对外释放Web Service。系统应用服务器对外交互,系统中基于MSMQ的异步操作,等等。
7、网友提问:可否给出编程中通用的事例Hello来进行讲解?
张逸: 其实,cool所说的例子,网上有很多。用WCF编写hello,很简单:
using System.ServiceModel; [ServiceContract] public interface IHello { [OperationContract] void SayHello(string msg); } public class Hello:IHello { public void SayHello(string msg) { Console.WriteLine(msg); } } |
张逸: 呵呵!上述例子中除了几个Attribute之外,和普通编程没有太大区别。唯一不同的是,当我们开发了这个服务之后,还需要Host。
8、网友提问:请两位老师简单地说一下,您们认为WCF最大的优势在哪?
赵劼: 个 人认为WCF的最大优势在于统一和简化了分布式技术的运用。以前使用不同的分布式技术,写法大相径庭。而现在,往往只需要进行Attribute标记,再 加上配置就可以实现不同技术下的分布式通信了。这样让程序员把更多精力可以放在业务相关的逻辑上,而不会拘泥于技术实现本身。
9、网友提问:WCF最大的优点是不是就是在接口不变的情况下,可以修改通信方式?如果我暂时没有这样的需求是不是可以先不考虑使用WCF?换句话说,从remoting到WCF切换有什么风险?
赵劼: 从Remoting到WCF切换的风险主要还是在于工程上,而不是技术上。一般说来,Remoting能够实现的功能WCF都能够胜任,但是此类“移植”的工作也有很多与技术无关的问题,比如耗费的成本,移植后所带来的风险等等。
张逸: 如果仅局限于在局域网中的话,如果已经用Remoting开发了一个很稳定的系统,我并不建议草率地将其升级为WCF。
10、 主持人:利用WCF,不同系统之间可以进行通信,同时,层与层之间也可以基于WCF来进行通信。对于UI层与BLL层之间的通信,如果是基于WPF或 WinForm的C/S架构,那么基于WCF是非常方便的,但是如果是B/S的架构,ASP.NET页面与业务逻辑层可能部署在同一个IIS中,以前可以 直接基于API来调用业务逻辑层,现在有无必要也基于WCF来实现?
赵劼: “分布式 应用的第一条准则就是不分布式”,分布式通信相对于进程间通信的确会带来较为明显的性能降低,像您说的情况,比如ASP.NET的Web层和业务逻辑,很 可能就不应该使用WCF来通信。事实上,如果用Java一脉的技术来说,以前EJB远程访问横行,但是现在的互联网应用几乎都不太适用EJB了,而是使用 Struct、Spring等轻量级框架,因为远程通信代价很高。
张逸: 选择某种技术,首先要看其具体应用的 场景和需求,而不是觉得这门技术好或者新就选用。对于B/S系统而言,如果需求没有要求其他系统采用服务的方式调用该B/S系统,那就没有必要采用WCF 技术。最合理的方式是,在B/S系统中,专门设计一个服务层,体现所谓面向服务的特点,这个服务层中的服务相对粒度较粗一点,而且应该是其他系统可能会调 用的。我们可以事先考虑到这一层的设计。它并不一定是B/S系统内部调用,而是考虑未来的扩展。
11、网友提问:我还有一 个问题,我觉得WCF还是没有一个明显的应用服务器。如果部署在iis的,那其实就是web service了吧!不知道WCF是否会有一个真正的应用服务器,就好像com+和ejb的应用服务器那样,提供完整的组件管理,调度,负载均衡等功能。
张逸: 其 实BizTalk就是很好的一个应用服务器。当然,我们也可以利用WCF开发一个轻量级的应用服务器。网上有这方面的文章。 赵劼:当然,万事不能一概而论,对于一些企业应用,或者大规模的系统集成,很可能也是需要使用WCF将业务逻辑进行释放。这也就是为什么互联网应用大都不 需要单独的应用服务器,而企业应用很多都会有独立的应用层。
12、网友提问:WCF程序现在的稳定程度如何?可以大规模在企业开发中应用吗?
张逸: 目前WCF已经得到足够的发展,稳定性方面完全能够适用于企业开发。唯一美中不足的是,对于Internet场景,利用HttpBinding传输的方式,在性能上还存在一定的局限性。
13、网友提问:WCF有哪些扩展点?比如我自定义transfer sink,自己在传输链路中加入安全机制等?
赵劼: WCF提供了很灵活也很复杂的扩展。我没有理解您的意思,如果您只是说实现自己的安全机制,这个自然可以。但是如果您是指在TCP/IP协议级别(或类似的通信级别)的扩展,那么很明显WCF就无能为力了。
14、网友提问:WCF支持一个接口暴露成RSET服务吗?
赵劼: 在.NET 3.5中提供了WCF HTTP Service,专为释放RESTful接口而设计。
张逸: 目前WCF支持对绑定和行为的扩展。建议你阅读一下MSDN中Aaron Skonnard的文章,他对于这些内容已经做了很好的介绍。另外,WCF 3.5支持REST服务。您可以看看这篇文章:http://msdn.microsoft.com/msdnmag/issues/07/12/ServiceStation/Default.aspx?loc=zh
15、网友提问:有人说WCF是Vista的组成部分,确实是这样吗?它们之间有什么关系?
赵劼: Vista包含了WCF,但是WCF是个可以独立于Vista的组件,例如您也可以在Server 2003中安装使用。
16、网友提问:Ajax调用WCF,会不会加重服务器的承受能力?
赵劼: WCF本身不会对服务器增大压力,带来压力的一般都是业务本身。也就是说,WCF很难成为性能瓶颈。不会因为AJAX调用WCF而造成性能问题。
17、网友提问:Remoting有一种工厂方式的创建边界对象的方法使用还很广泛,WCF中好像没找到对应的方式。WCF里有Duplex消息交换模式,但还是不能解决remoting客户端从一个简单接口批量获取一群边界对象的问题,至少不能完全代替。
张逸: 不明白您所指,是否是说Remoting中采用Marshal方式创建对象呢?
张逸: 边界对象是说BoundObject?
网友提问: 就是说能调用远程方法的对象。就是说在服务端声明一个Marshalbyref的对象,然后用一个工厂方法去获取这个对象。当然这个工厂方法也要暴露为remoting接口,这样客户端就可以是用这个工厂方法一下获取好多远程对象来使用。
张逸: 我认为WCF包含的三种实例模式,完全涵盖了过去Remoting的三种激活模式。
张逸: 现在WCF对于客户端的增强,不仅仅体现在Deplex上,而且WCF对回调方法的强有力支持,已经加强了服务端与客户端的交互能力。
张逸: 我明白了您的问题了,这个问题我以前在学习Remoting的时候,提出过。实际上,现在利用WCF的ChannelFactory就能够实现这一目标。在《WCF服务编程》中也将其分为管理方式与编程方式两种。
18、网友提问:WCF如何使用linq to sql实现企业级应用!?
赵劼: LINQ to SQL和WCF其实没有必然联系,一个是数据访问技术,一个是分布式通信技术,可以随意搭配使用。当然,可能也有一点需要注意的地方,那就是LINQ to SQL的一些类型比如EntitySet,是不能被WCF序列化的,传输的时候转换成其他数据类型。
赵劼: AJAX调用WCF本身不会造成性能问题,性能问题往往是由程序开发引起的。WCF和AJAX本身都是很纯粹的技术,合理运用不会有任何问题