不引用服务而使用WCF,手动编写客户端代理类

前面我写过一个用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();
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 服务器
, int
, 服务
, 前面
, public
, 服务引用
, wcf 服务引用
wcf引用
wcf测试客户端、wcf客户端调用、wcf获取客户端ip、wcf 客户端、wcf 客户端代理类,以便于您获取更多的相关知识。

时间: 2024-08-04 14:20:44

不引用服务而使用WCF,手动编写客户端代理类的相关文章

WSDL手动生成WebService代理类的方法

通常要手动生成WebService代理类需要把一句生成语句,如 wsdl.exe /l:cs /out:D:\Proxy_UpdateService.cs http://localhost:1101/UpdateService.asmx?wsdl拷贝到Visual Studio 2005 命令提示窗口中去执行,这里再介绍另一个办法. 首先打开Visual Studio 2005,选择菜单"工具"-"外部工具"打开外部工具对话框,如图,单击"添加"

WCF使用Svcutil.exe生成客户端代理

svcutil.exe 参数 1 /async /async 同时生成同步和异步方法签名. 默认设置:只生成同步方法签名. 缩写形式:/a 2 /tcv:Version35 /tcv:Version35   指定应用程序针对 .NET Framework 的哪个版本.有效值为:Version30 和 Version35.默认值为 Version30. 缩写形式:/tcv Version30:如果为使用 .NET Framework 3.0 的客户端生成代码,则使用 /tcv:Version30.

C#面向服务编程技术WCF从入门到实战演练

  一.WCF课程介绍 1.1.Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的.不能哪一个技术框架和行业标准作比较,任何对于二者的比较都是错误的,因为两者根不不在同一个范畴里.就好比不能拿个汽车和交通法规比较一样,这是个误区. 阿笨的宗旨就是学完此<C#面向服务编程技术WCF从入门到实战演练>课程,让您从零基础上手后直接将学习的成果运用到实际项目中去.阿笨本次分享的WCF技术是完全来源于切身实际项目中

COM(VB/VBA/Script)利用服务标记调用WCF服务之四:使用配置文件

这几天友人同学说他在COM利用服务标记调用WCF服务的时候遇到一个问题,就是他返回的的Soap消息 大于65536这个wsHttpBinding的缺省值,引发调用错误.需要将MaxReceivedMessageSize更改成可以容纳 大消息内容的值.在我前面的三篇文章中使用的都是缺省的wsHttpBinding,所以不存在这个问题.现在 需要更改缺省值自然就需要增加配置来达到目的.目前最关键的问题就是:是否能让VB/VBA/Script来使 用配置文件呢?如果可以,那如何让VB,VBA, Scr

COM(VB/VBA/Script)利用服务标记调用WCF服务之三使用WSDL契约

前面我们介绍了使用MEX契约的服务标记在COM中调用WCF服务,这种方式是通过MEX终结点动态取得元 数据,使用起来是比较方便:但是有时服务的元数据中可能包含恶意用户可以利用的关于应用程序的敏感 信息,也就是说为了安全考虑有些服务可能不会通过MEX公布元数据信息.如果哦某些服务没有公布元数 据信息,用类型化有比较麻烦,针对这种情况我们该如何在COM中调用WCF服务呢?这时我们可以使用WSDL 契约来进行WCF服务的调用,使用这种方式和使用MEX类似,同样不需要进行类型的注册,信息都是通过动 态得

COM(VB/VBA/Script)利用服务标记调用WCF服务之二使用MEX契约

第一步:创建WCF服务 上一篇我们使用类型化契约的服务标记在COM中调用WCF服务,不过这个有一 定的局限性,因为需要注册类型,所以需要.Net FrameWork,但是在很多情况下COM客户端所在的环境没有 .Net Framework,比如说在Excel中,需要调用一个WCF服务来计算某个单元格的值,而且这个Excel文件可 能分发到许多机器上,你总不能给每台机器都装一个.Net Framework,同时都去给它注册所需的类型吧. 针对这种场景,我们可以使用MEX契约的服务标记来动态得到服务

请问,Java用何种技术架构编写服务端,能让VB客户端访问?

问题描述 各位大哥大姐,小弟菜鸟一只,只会点JAVA和VB.今日心血来潮,想向各位请教个问题.Java用何种技术架构编写服务端,能让VB客户端高效安全的访问?Webservice,COM+,CORBA?这些名词都听说过,可惜小弟才疏学浅,闻其名,却不知其意.请各位指教.非常谢谢. 解决方案 本帖最后由 skill_job 于 2011-07-16 01:22:45 编辑

asp.net c# webForm中 怎样在服务端调用c++builder编写的ocx控件,急...

问题描述 asp.netc#webForm中怎样在服务端调用c++builder编写的ocx控件 解决方案 解决方案二:自动顶解决方案三:该回复于2016-01-31 23:32:46被版主删除

Svcutil怎么对多个WCF服务同时进行生成代理类?

问题描述 由于项目需要对多个WCF接口进行调用,用SVCUTIL工具对每个接口分别生成的代理类,里面会存在很多相同的代码,导致冲突报错,请问下各位达人,有没办法对多个WCF服务同时生成代理类,让各个代理类公共的类自动全部生成在一个公共类里?谢谢 解决方案 解决方案二:SVCUTIL应该拿着WSDL生成代理类厄.解决方案三:汗,有木有人知道怎么搞啊解决方案四:写批处理svcutil.exe"http://localhost/test.svc?wsdl"/o:"..Service