WCF学习心得----(五)生成客户端

1.    通过Svcutil.exe工具直接生成客户端

1.1     将服务承载于IIS上

1.1.1 在IIS中新建网站,所示效果如下图:

1.1.2   新建WCF应用程序,项目文档结构如下图:

1.1.3   选中项目,点击右键在资源管理其中打开文件,结构如下:

将上图中红框标记的文件拷贝至跟网站虚拟目录映射的物理路径下,一般都是在C盘,如下路径C:\inetpub\wwwroot

1.1.4 启动网站,并在浏览器中浏览,会看到如下的文档目录:

1.1.5  点击其中后缀为.svc的文件,看到如下效果,同时浏览器中的url即为下面我们生成客户端调用类所用的参数

CalculatorService 服务图

生成客户端调用类所需的服务地址

1.2 打开命令行提示符工具,输入一下命令,将目录定位到Svcutil.exe所在的目录。

Svcutil.exe目录一般位于C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin文件夹下,所以命令如下:

Cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\

如图所示:

1.3 定位到该文件下之后,继续键入以下命令:

Svcutil.exe  /out:C:\CalculatorClient.cs  /config:\C:App.config

http://10.10.60.79:116/CalculatorService.svc

如图所示:

备注:

Svcutil工具生成客户端使用类有固定的语法参数,下面仅列出了该文所需的一些参数,至于其他的参数以后可能还会涉及到,有兴趣的话可以去msdn上了解一些。

1)       “/out:”后跟生成文件的存放路径+文件名+.cs

2)       “/config:”后跟生成文件的存放路径+app.config

3)       http://....  为服务的地址,此例中采用的是在IIS中承载,如果是在托管的应用程序中承载,还需要保证承载服务的应用程序运行起来。Svcutil.exe通过该服务地址,生成下载客户段使用类,如果是自承载则该地址要跟配置文件中的<host>节点下的<address>节点中的地址是一致的。

1.4 打开在1.3中指定的生成客户端调用类的路径,即可找到生成的客户端调用类和配置文件

1.5 将生成的类文件和配置文件,添加到新建的客户端项目中即可。

2.    通过System.ServiceModel. ChannelFactory<TChannel>直接创建服务代理对象

直接看一下通过ChannelFactory生成的客户端代理类的类文件:

namespace ZWCFServiceClient
{
//该服务协定,跟服务端的协定是一样的
[ServiceContract(Namespace = "http://ZWCFService")]
public interface ICalculatorService
{ [OperationContract]
double Add(double n1, double n2); [OperationContract]
double Subtract(double n1, double n2); [OperationContract]
double Mutiply(double n1, double n2); [OperationContract]
double Devide(double n1, double n2);
} class Program
{
static void Main(string[] args)
{
//主要通过以下高亮代码生成客户端调用对象
EndpointAddress address = new EndpointAddress("http://localhost:8000/ZWCFService/CalculatorService");
WSHttpBinding binding = new WSHttpBinding();
ChannelFactory<ICalculatorService> factory = new ChannelFactory<ICalculatorService>(binding, address);
ICalculatorService calculator = factory.CreateChannel(); Console.WriteLine("{0}+{1}={2}",1.2,2,3,calculator.Add(1.2, 2.3));
Console.WriteLine("{0}-{1}={2}",3.4,2.3,calculator.Subtract(3.4, 2.3));
Console.WriteLine("{0}*{1}={2}",4.5,3.4,calculator.Mutiply(4.5, 3.4));
Console.WriteLine("{0}/{1}={2}",5.6,4.0,calculator.Devide(5.6, 4.0)); Console.WriteLine("Operation Over");
Console.WriteLine("Press any key to terminate the Console");
Console.Read();
} }
}

3.    通过在客户端添加服务引用来生成客户端

3.1在客户端应用程序中,选中项目,点击右键à添加服务引用,然后会弹出如下框

3.2 在地址栏里键入服务的地址,然后点击前往

当服务列表出现对应的服务时,说明已找到该服务

3.3 在命名空间栏里边为服务重新定义命名空间,然后点击确定

3.4 在程序中直接通过在3.3中定义的命名空间+”.”+服务名如:

CalculatorClient.CalculatorService  calculator=new CalculatorClient.CalculatorService();

这样就新建了一个客户端调用类,可以调用服务。

WCF学习心得----(五)生成客户端的更多相关文章

  1. WCF学习心得----(四)服务承载

    WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  2. WCF学习心得----(三)服务承载

    WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  3. WCF学习心得------(七)消息协定

    第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...

  4. WCF学习心得------(六)数据协定

    --前言 最近各种事忙的把之前的WCF学习给耽误了一些,今天抽时间把之前的学习内容给总结了一下,因为知识点比较细碎没有做太多的练习示例,只是对其中关键的知识点做了总结,希望可以对大家有所帮助. 第六章 ...

  5. WCF学习心得------(二)设计和实现服务协定

    设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...

  6. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  7. WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)

    WCF服务调用通过两种常用的方式: 1:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式. 2:一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 本文只针对通 ...

  8. WCF学习心得

    之前很经常听说WCF,不过没有怎么接触过,直到最近才真正使用到WCF,虽然也只是皮毛而已,在此也做个记录总结吧. 下图是我使用WCF的练手项目,由于是使用VS2010直接创建的WCF服务应用程序,VS ...

  9. WCF学习心得------(三)配置服务

    配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...

随机推荐

  1. LeetCode Permutations II (全排列)

    题意: 给出n个元素(可能有重复的),请产生出所有的全排列. 思路: 同版本1的有点不同,这次有可能含有重复的元素,很容易就TLE,节省时间才是关键点. 如果将一个序列中两个相同的元素交换,这个序列是 ...

  2. LeetCode Maximum Subarray (最大子段和)

    题意: 给一个序列,求至少含一个元素的最大子段和? 思路: 跟求普通的最大子段和差不多,只不过需要注意一下顺序.由于至少需要一个元素,所以先将ans=nums[0].接下来可以用sum求和了,如果小于 ...

  3. cmake在实际复杂项目中的使用

    在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂. 最近看了一下cmake,发现配置 ...

  4. DNS劫持和DNS污染解决办法

    编号:1013时间:2016年5月26日09:35:27功能:DNS劫持和DNS污染解决办法URL : http://www.itechzero.com/dns-hijacking-dns-pollu ...

  5. EL 表达式 取值将 < 转成 &1t 问题

    因为用JeeCMS,JeeCMS后台会存入<p></p> 内容到数据库中 用play框架取后台值的时候 用的EL表达式在前台展示 出现将< 转成 &1t HTML ...

  6. 《你不知道的JavaScript》第一部分:作用域和闭包

    第1章 作用域是什么 抛出问题:程序中的变量存储在哪里?程序需要时,如何找到它们? 设计 作用域 的目的:为了更好地存储和访问变量. 作用域:根据名称查找变量的一套规则,用于确定在何处以及如何查找变量 ...

  7. MyBatis日期有坑

    使用MyBatis时,可能会遇到日期格式的时间段问题,当数据库的时间为DATE类型时,MyBatis的jdbcType应该使用DATE,否则,有时间会出现莫名的数据找不到的问题,具体原因,可以查看源码 ...

  8. Day08_面向对象第三天

      1.代码块(掌握) 1.概述     由{}扩起来的代码称之为代码块,类或者方法也可认为是代码块,但是一般不这么说,我们平时所说的代码块指的是孤零零的{} 2.代码块作用     局部代码块作用  ...

  9. 无法Ping通windows 7主机

    今天在使用Filezilla FTP_SERVER新建了一个windows主机上的FTP服务器. 建立完成之后,从MAC上无法进行连接也甚至连主机也无法连接,怀疑是防火墙的问题. 网上一搜确实是,但是 ...

  10. [转载]NoSQL by Martin Flower

    ============================================================== URL1 nosql ========================== ...