宁波.NET俱乐部第二次聚会WCF讲稿
宁波.NET俱乐部WCF讲座
目标:
尽量以全面和容易理解的视角系统和初步地讲解WCF,使得不熟悉WCF系统的会员能对WCF分布式技术有一个感性和直观的认知,从而使社区成员开始关心这一项技术,形成一个学习、讨论和交流的良好环境。在这样的环境中不断提高大家的整体水平。
主讲:王弈博
Hello WCF
WCF是什么?
WCF是一种在面向服务的理念下催生的分布式通讯技术解决方案。
为什么要面向服务
随着时代的不断发展,人们对于信息的处理不可避免的要越来越依赖网络。对于我们程序员来讲,面向WEB开发产品已成为不可阻挡的趋势。
但传统的网络体系是存在弊端的,弊端在于信息的提供者之间很难做有效的交流。我们将我们所拥有的信息以html的格式发送到客户的浏览器中,甚至使用更加封闭的原始C/S技术,对于最终用户来讲,他很容易去解读、获取其中的信息,但如果有另外的公司或个人想使用我们的信息和其它地方的信息去做整合分析或者应用,那将是很困难的事情。如图所示:
所以,问题就在于,我们缺乏一个统一的全球性的数据信息表达方式,这导致虽然我们面向了WEB,但信息提供者之间仍然是相对独立和自治的,我们拥有上千亿的WEB资源,但我们却很难对这些资源作有效的整合和分析,以提供更为先进和强大的应用。
我们将场景的范围适当缩小,举一个实际一点的例子。
对于一个稍大一点的公司,各个部门分别同时使用很多不同的系统是很正常的事情,但传统的开发理念导致这些系统仍然是相对自治的,部门之间很难做有效的资源整合和复用,很多企业不得不面对重新部署新系统或者添加大量转换接口的痛苦选择,信息化不仅没有给企业带来更多的好处,反而造成了严重的负担。
同样在政府所提倡的政务信息化的今天,我们又何尝不为部门间无法有效地共享信息而烦恼?为什么我们至今无法建立个人诚信系统档案?
后来便有了面向服务体系的观点,数据提供者在WBE上发布获取数据的方法,从而让合法的数据使用者使用这些数据,而WEB服务使用者可以整合从多个WEB服务提供商那里得到的数据,为最终用户提供更有价值和更人性化的服务。
这样的WEB模式不仅实实在在地解决了传统方案的问题,也给用户带来了前所未有的便利,极大地扩展了软件公司的生存空间。
未来的WEB开发模式
下面的图可以很好地诠释未来的WEB环境:
不仅原来分治的系统被有效地整合复用,各种语言、操作系统、客户端表现技术都被有机地整合了起来,WEB应用将再一次获得极大丰富。当然这其中会涉及很多问题,比如版本控制,但这种面向服务体系的趋势已不可避免。
(其实我们将各个系统看成类,将WEB服务看成类所提供的方法,呵呵,又一个软件轮回。)
回到WCF
现在泛泛而谈就很容易理解了,WCF就是一种非常非常优秀的面向Web服务的技术解决方案之一,它是微软自家各种分布式技术的集大者,是积累在自家产品的丰富经验的基础上开发出来的,是.NET 3.0中最为重量级的技术,是一颗即将被广泛应用的新星。
所有分布式解决方案都遵循一个统一的传输协议:SOAP,并且要尽最大可能遵循WS-*的所有功能性规范,在这样的前提下,面向服务的体系才能真正有效地被建立。
在目前的所有分布式框架解决方案中,WCF最为完全和精准地实现了WS-*的一系列标准,在WS-*体系的后续发展中,微软的努力极大地推广了WS-*标准的发展,WCF自然成为业界效仿的典范之作,掌握好WCF,并且逐步深入它,你会逐渐清楚地认知整个WS-*体系,东西是微软的,但知识却是相通的。精通WCF,你就一定能精通所有的其他分布式技术。
WCF step by step
我们接下来感性地认识一下WCF。使用vs 2008 IDE先建立一个叫做“EasyWcfLibrary”的项目(使用WCF Service Library模板),如图:
随后依次建立一个“WCFServiceHost”的控制台项目,用来Host我们的WCF Web服务。再建一个WinForm项目,叫Client1,一个WPF项目,叫Client2。建完后如图:
接下来我们打开“EasyWcfLibrary”项目的IService1.cs文件,我们发现,模板自动给我们生成了这样的一个接口:
并且在Service.cs文件中实现了这个接口:
面向接口的概念我不想在这里涉及,简单的说,Service1这个类型就是我们简单的一个将要对外发布的服务,别人可以通过WEB调用我这里提供的两个方法,并且无论是JAVA调用,还是C++调用,我们的系统即能正确识别传递过来的参数,结果返回值也能被这些系统正确解析(全赖SOAP协议和WS-*规范)。
不用把事情想得太复杂,你完全可以认为这就是一个DLL,只不过普通的DLL不能垮WEB被使用,而这个DLL可以。
接下来做的就是要在一个合适的地方运行这个DLL,这个地方就叫WCF Service Hoster,刚才我们建立了一个控制台项目,我们先引入一个叫“System.ServiceModel”的DLL,再将刚才的EasyWcfLibrary项目导入:
然后将EasyWcfLibrary项目中的配置文件:“App.config”复制到这个项目中。
最后填充Main函数,以启动WCF Web服务:
运行这个控制台项目,如图:很简单,服务启动了:
服务正常运行了,接下来的问题是客户端如何调用这个服务,我们还是先不要涉及太多的概念,化繁为简地说,我们打开刚才复制的配置文件“App.config”,这里定义了很多东西,它们都是用来描述我们刚才那个WCF服务的,我们找到这里:
复制一下这个地址。我们在浏览器中打开:
我们很高兴地看到WCF服务被开启了,而且里面还有个地址,这个地址便是客户端用来获取WCF服务器端方法和类型定义相关信息的,我们打开看一看:
关掉这个浏览器,我们回到vs 2008 IDE,我们在WinForm客户端中引用这个WEB服务:
将地址填入,点击“Go”:
将Namespace改一下,如上图。点击“OK”,这样vs 2008 IDE就帮我们自动生成了一个代理类。
然后我们简单的设计个界面,并且写一下调用代码:
首先我们需要new一个刚才生成的代理类,然后简单地使用之前我们写的WCF服务。
写完运行:
可以看到,我们已经成功地使用了WCF服务。
同样的步骤,我们在WPF项目中建立客户端,填写代码,运行:
不仅仅是WinForm还是WPF还是ASP.NET,你都可以调用WEB服务。
微软的东西从来都是入门简单上手快,但隐藏在后面的细节总是庞大的,就像C#,入门相当容易,但隐藏在后面的庞大的细节和原理如果没有非常扎实的计算机基础是不可能做到全面贯通和理解的,WCF涉及到庞大的WS-*规范,这不是我们今天能涉及到的内容,但使用WCF基本的流程步骤就是:定义一个WEB服务接口,实现这个接口,利用一个宿主将这个服务host起来(这个宿主可以是控制台,可以是WinForm,可以是IIS等等),并在配置文件中写明白你这个WEB服务的地址在什么地方(Address),用哪种基本的通讯协议去访问(Http或者TCP/IP或者其他等等)(Binding),你这个WEB服务定义了什么操作方法,这些方法会传递哪些类型(Contract),是否加密传输、线程池最大数量、客户端无响应所允许的最大时间等等等等。改写完配置文件后,你的WCF服务就搞定了。细节的工作WCF全部遵循WS-*标准替你完成了。
而客户端可以通过获取服务器提供的描述:wsdl,由IDE替你生成一个代理类,然后你在本地使用这个代理就可以了。
希望此节课能帮助大家对WEB服务的必要性有所了解,对WCF有一个比较好的初步认识,网上有很多一步步学WCF的教程,我相信经过我的初步讲解,大家能有一个比较清楚的初步认识, SO和OO是两个层次上的概念,OO解决的是如何处理好系统内部的问题,解决的是系统内部代码复用的问题,SO解决的是各个独立系统之间交互的问题,解决的是系统之间的功能复用,和资源交互的问题,一定要认清面向WEB服务编程的重要性。
下面是集体讨论时间,希望大家踊跃发表自己的看法.