Welcome

首页 / 软件开发 / WCF / 不引用服务而使用WCF,手动编写客户端代理类

不引用服务而使用WCF,手动编写客户端代理类2014-03-10 csdn博客 东邪独孤前面我写过一个用WCF开发的聊天程序,大家可以翻看前面的博文。

在那个聊天程 序中,我是不引用服务而直接使用WCF。之前没有跟大家说这一知识点,对于初学者朋友来说 ,可能不知道怎么回事。

我们之所以说WCF比一般的Web Service要强大得多,是因为 它要比一般的Web服务要灵活得多,而且它不仅仅能在IIS服务器上运行,其实它可以用很多 种方法来运行,哪怕一个控制台应用程序。

现在,大家可以回忆一下前面我写的《传 说中的WCF》,我上面的例子绝大多数都是控制台应用程序类型的。我们应当把WCF理解为一 种通信技术,而不只是服务。前面的例子中我是告诉大家,完成服务器端后,就在客户端项 目中添加服务引用,这样就生成了客户端代理类,我们就可以像平时使用一般类型一样使用 了。

其实按照我们前面所讲的方法,也足以完成许多实际任务了。大家是否还想拓展 一下呢? 有朋友肯定会问了:再拓展会不会变得很难? 放心吧,不会很难,相信我,老周从 来不会讲大家都看不懂的东西的。

我们现在不妨尝试一下,在客户端不添加服务引用 ,而是由我们自己来编写调用服务的代理类。要做到这一点,首先我们要明确的,其实我们 所编写的服务协定,在服务器和客户端都需要用到,如果大家查看过添加服务引用时由工具 生成的代码,会发现其实它在客户端也生成了服务协定的代码。所以,在我们手动编写调用 服务的代码时,也需要这样,因此有两种方法可以在服务器和客户端之间共用服务协定,一 是把代码复制一下粘贴到客户端中,另一种方法,我们可以新建一个类库,然后把服务协定 写到这个类库中,最后在服务器端和客户端都引用这个类库即可。举个例子,假如有以下定 义的协定:

[ServiceContract]public interface ITest{[OperationContract]int Add(int a, int b);[OperationContract]int GetRandmon();[OperationContract]int Multiply(int a, int b);}
然后,我们在服务器端实现协定,注意:接口在服务器端实现即可,客户端不需 要。

// 实现服务public class MyService : CommonLib.ITest{Random m_rand = null;// 构造函数public MyService(){m_rand = new Random();}public int Add(int a, int b){return a + b;}public int GetRandmon(){return m_rand.Next();}public int Multiply(int a, int b){return a * b;}}
接着,和以前一样,创建服务主机,并侦听客户端调用。

static void Main(string[] args){ServiceHost host = new ServiceHost(typeof(MyService));// HTTP方式WSHttpBinding httpBinding = new WSHttpBinding(SecurityMode.None);host.AddServiceEndpoint(typeof(CommonLib.ITest), httpBinding, "http://localhost:8900/");// TCP方式NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None);host.AddServiceEndpoint(typeof(CommonLib.ITest), tcpBinding, "net.tcp://localhost:1700/");// 打开服务host.Open();Console.WriteLine("服务已启动。");Console.Read();host.Close();}