WCF是DotNet体系中很重要的一项技术,但是组内很多组员通过书籍自学的时候感觉涉及面太广、配置文件太复杂,新名词太多、抓不到头绪,有感于此,决定进行一次组内技术培训,顺便把培训讲义整理到blog上来。不求大而全,而是要让初学者快速入门,因此想入实例入手,并刻意隐藏一些初期用不到的内容,以降低入门门槛。有任何错误欢迎指正。
注:本系列文章基于.Net Framework 3.5,以教程的最后会归纳一下到了4.0中有哪些差异。
----------------------- 分隔线 -----------------------
第一篇:入门,构建第一个WCF程序
1、服务端
建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约。这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准。别忘了添加对System.ServiceModel的引用。
- using?System;?
- using?System.ServiceModel;?
- using?System.Text;?
- ?
- namespace?Server?
- {?
- ?????
- ?????
- ?????
- ????[ServiceContract(Namespace="WCF.Demo")]?
- ????public?interface?IData?
- ????{?
- ?????????
- ?????????
- ?????????
- ????????[OperationContract]?
- ????????string?SayHello(string?userName);?
- ????}?
- }?
针对这个接口建立实现类,这个类才是真正干活的,工作在服务端,不出现在客户端:
- using?System;?
- using?System.Text;?
- ?
- namespace?Server?
- {?
- ?????
- ?????
- ?????
- ????public?class?DataProvider?:?IData?
- ????{?
- ????????public?string?SayHello(string?userName)?
- ????????{?
- ????????????return?string.Format("Hello?{0}.",?userName);?
- ????????}?
- ????}?
- }?
为工程添加一个App.config文件,这里面要定义与服务发布相关的参数。WCF中常见的做法是用代码写服务逻辑,但是用配置文件来定义服务发布方式,这样做的好处是松散耦合。
- <?xml?version="1.0"?encoding="utf-8"??>?
- <configuration>?
- ??<system.serviceModel>?
- <!--?看到services节,就表明这是在定义服务相关的内容?-->
- ????<services>?
- ???????
- ??????<service?name="Server.DataService">?
- ?????????
- ????????<host>?
- ???? ??<baseAddresses>?
- ???????? <add?baseAddress="http://localhost:8080/wcf"?/>?
- ????? ?</baseAddresses>?
- ????</host>?
- ???? ?
- ????<endpoint?address=""?binding="basicHttpBinding"?contract="Server.IData"?/>?
- ??????</service>?
- ????</services>?
- ??</system.serviceModel>?
- </configuration>?
?
万事具备,只剩最后一步了,将服务发布出去:
- using?System;?
- using?System.ServiceModel;?
- ?
- namespace?Server?
- {?
- ????class?Program?
- ????{?
- ????????static?void?Main(string[]?args)?
- ????????{?
- ???????? ?
- ????????????using(ServiceHost?host?=?new?ServiceHost(typeof(Server.DataProvider)))?
- ????????????{?
- ????????????????host.Open();?
- ????????????????Console.WriteLine("Service?Running?...");?
- ????????????????Console.ReadKey();?
- ????????????????host.Close();?
- ????????????}?
- ????????}?
- ????}?
- }?
有人可能会问服务发布到哪去了?没指定地址呀?这是一个初学者容易搞不明白的地方。
是的,此时App.config中的定义就发挥作用了,由于ServiceHost中指定对Server.DataProvider类服务,而App.config中定义了name="Server.DataProvider"的service,其下有endpoint,定义了绑定方式是basicHttpBinding,而http方式的baseAddress只有一个,就是 http://localhost:8080/wcf。
编译运行,屏幕显示Service Running ... 就是正常跑起来了,此时如果用命令行 netstat -ano | findstr "8080" 看一下,应该有如下输出:
- TCP????0.0.0.0:8080?????????0.0.0.0:0??????????LISTENING??????4?
- TCP????[::]:8080????????????[::]:0?????????????LISTENING??????4?
表示我们的程序已经在TCP 8080端口开始监听了。值得注意的是PID是4,这是系统进程而不是我们自己的进程,这说明WCF程序对外提供HTTP服务时,是借用了系统功能(http.sys)。
此时如果我们用浏览器访问一下 http://localhost:8080/wcf,不报错,但是会提示“当前已禁用此服务的元数据发布”,这是由于默认不允许以http get方式获取服务的WSDL,我们不用管它,不影响后面的使用,以后的章节中我们再来看这个问题。
2、客户端
再建立一个控制台应用程序作为Client,把Server中的接口IData拷过来,因为这是服务契约。
为工程添加一个App.config文件,这里面要定义客户端访问的相关参数,这里我去掉了一些用不上的参数,以保持配置文件简单,防止各位看晕了头。
- <?xml?version="1.0"?encoding="utf-8"??>?
- <configuration>?
- ??<system.serviceModel>?
- ?????
- ????<client>?
- ???????
- ??????<endpoint?name="DataService"?address="http://localhost:8080/wcf"?binding="basicHttpBinding"?contract="Server.IData"?/>?
- ????</client>?
- ??</system.serviceModel>?
- </configuration>?
然后写代码,来调用Server端发布的SayHello方法:
- using?System;?
- using?System.ServiceModel;?
- using?System.ServiceModel.Channels;?
- ?
- namespace?Client?
- {?
- ????class?Program?
- ????{?
- ????????static?void?Main(string[]?args)?
- ????????{?
- ????????????
- ?
- ????????????var?proxy?=?new?ChannelFactory<Server.IData>("DataService").CreateChannel();?
- ?????????????
- ????????????Console.WriteLine(proxy.SayHello("WCF"));?
- ?????????????
- ????????????((IChannel)proxy).Close();?
- ????}?
- }?
编译运行,屏幕应能正常打印出“Hello WCF.”。第一个入门demo就搞定了,应该还是比较简单的。只是App.config的配置有些复杂,后面我们会看到,其实也可以不要配置,直接用代码搞定,不过从松散耦合的角度讲不建议这么做。
?
本文出自 “汪汪爱杨杨” 博客,请务必保留此出处http://www.voidcn.com/article/p-kfrmxoat-th.html