WCF简单教程(1)入门-创新互联

WCF是DotNet体系中很重要的一项技术,但是组内很多组员通过书籍自学的时候感觉涉及面太广、配置文件太复杂,新名词太多、抓不到头绪,有感于此,决定进行一次组内技术培训,顺便把培训讲义整理到blog上来。不求大而全,而是要让初学者快速入门,因此想入实例入手,并刻意隐藏一些初期用不到的内容,以降低入门门槛。有任何错误欢迎指正。

10年积累的成都网站建设、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有镇海免费网站建设让你可以放心的选择与我们合作。

注:本系列文章基于.Net Framework 3.5,以教程的最后会归纳一下到了4.0中有哪些差异。

----------------------- 分隔线 -----------------------

第一篇:入门,构建第一个WCF程序

1、服务端

建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约。这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准。别忘了添加对System.ServiceModel的引用。

  1. using System;

  2. using System.ServiceModel;

  3. using System.Text;

  4. namespace Server

  5. {

  6.   ///

  7.   /// 用ServiceContract来标记此接口是WCF的服务契约,可以像WebService一样指定一个Namespace,如果不指定,就是默认的http://tempuri.org

  8.   ///

  9.   [ServiceContract(Namespace="WCF.Demo")]

  10.   public interface IData

  11.   {

  12.     ///

  13.     /// 用OperationContract来标记此方法是操作契约

  14.     ///

  15.     [OperationContract]

  16.     string SayHello(string userName);

  17.   }

  18. }

针对这个接口建立实现类,这个类才是真正干活的,工作在服务端,不出现在客户端:

  1. using System;

  2. using System.Text;

  3. namespace Server

  4. {

  5.   ///

  6.   /// 实现IData接口,此处不需要写契约标记

  7.   ///

  8.   public class DataProvider : IData

  9.   {

  10.     public string SayHello(string userName)

  11.     {

  12.       return string.Format("Hello {0}.", userName);

  13.     }

  14.   }

  15. }

为工程添加一个App.config文件,这里面要定义与服务发布相关的参数。WCF中常见的做法是用代码写服务逻辑,但是用配置文件来定义服务发布方式,这样做的好处是松散耦合。

  1.  

  2.  

  3.  

  4.   

  5.   

  6.    

  7.     

  8.      

  9.     

  10.    

  11.    

  12.    

  13.   

  14.  

万事具备,只剩最后一步了,将服务发布出去:

  1. using System;

  2. using System.ServiceModel;

  3. namespace Server

  4. {

  5.   class Program

  6.   {

  7.     static void Main(string[] args)

  8.     {

  9.       //定义一个ServiceHost,注意参数中要使用契约实现类而不是接口

  10.       using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))

  11.       {

  12.         host.Open();

  13.         Console.WriteLine("Service Running ...");

  14.         Console.ReadKey();

  15.         host.Close();

  16.       }

  17.     }

  18.   }

  19. }

有人可能会问服务发布到哪去了?没指定地址呀?这是一个初学者容易搞不明白的地方。

是的,此时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" 看一下,应该有如下输出:

  1. TCP   0.0.0.0:8080     0.0.0.0:0      LISTENING    4

  2. 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文件,这里面要定义客户端访问的相关参数,这里我去掉了一些用不上的参数,以保持配置文件简单,防止各位看晕了头。

  1.  

  2.   

  3.   

  4.    

  5.    

  6.   

  7.  

然后写代码,来调用Server端发布的SayHello方法:

  1. using System;

  2. using System.ServiceModel;

  3. using System.ServiceModel.Channels;

  4. namespace Client

  5. {

  6.   class Program

  7.   {

  8.     static void Main(string[] args)

  9.     {

  10.       //客户端访问有多种方式,此处只显示一种

  11.       //利用ChannelFactory的CreateChannel方法创建一个IData的代理对象,其中参数“DataService”就是刚才在App.config中定义的endpoint的名称

  12.       var proxy = new ChannelFactory("DataService").CreateChannel();

  13. //调用SayHello方法

  14.       Console.WriteLine(proxy.SayHello("WCF"));

  15. //用完后一定要关闭,因为服务端有大连接数,不关闭会在一定时间内一直占着有效连接

  16.       ((IChannel)proxy).Close();

  17.     }

  18.   }

  19. }

编译运行,屏幕应能正常打印出“Hello WCF.”。第一个入门demo就搞定了,应该还是比较简单的。只是App.config的配置有些复杂,后面我们会看到,其实也可以不要配置,直接用代码搞定,不过从松散耦合的角度讲不建议这么做。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:WCF简单教程(1)入门-创新互联
URL地址:http://ybzwz.com/article/ecscj.html