阅读目录
一:前言
二:配置工作
三:通过元数据生成代理和配置文件
一:前言
. 这篇文章是与《一步一个脚印学习WCF之WCF概要—WCF服务的创建与调用HelloWorld实例,通过编码方式(四) 》一文相对比写的,如果其中有不明白的情参照链接文章。
二:配置工作
. 在Host工程里面为我们的Host这一端添加了一些配置,这个配置有两个方面,一个是方面关于Service的配置,也就是我们我们这个Host里面加载的Service的配置。另外一个方面是关于Host里面某些特定Service行为的配置。
在Host这一端我们来看配置文件
1:Service的配置
<service/>节点
1.1:在<services/>里我们添加了一个<service/>,这个service的名称就是我们前面实现的服务的名称,格式name="HelloWorldService.HelloWorldService",就是我们的命名空间+具体实现服务的名称。behaviorConfiguration="serviceBehavior",表示它服务的行为配置采用serviceBehavior这个策略
1 <service name="HelloWorldService.HelloWorldService" behaviorConfiguration="serviceBehavior">
1.2:我们看到暴露出了两个端点出来,这两个端点都是绑定Http协议,但是还是有区别的,上面的端点采用基本的Http进行绑定,下面的端点使用mexHttp进行绑定,这个mex是WCF里用于元数据交互的一种特有方式,在我们进行元数据交换的时候,指定了由WCF内建的一个接口”IMetadataExchange“,这个接口的主要作用就是来完成元数据的交换,并且在后面指定了这个端点具体的地址“mex”。上面的基于“basicHttpBinding”的端点它所绑定的契约就是在《一步一个脚印学习WCF之WCF概要—WCF服务的创建与调用HelloWorld实例,通过编码方式(四)》一文中的HelloWorldService.IHelloWorldService这个契约
1 <endpoint address="HelloWorldService" binding="basicHttpBinding" contract="HelloWorldService.IHelloWorldService" /> 2 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
1.3:在<endpoint/>这个节点描述完毕以后,然后就是<Host/>节点,这个service 它所运行在的Host,在Host里面主要描述了一个基本的地址就是“http://localhost:8000”,所以对于“HelloWorldService”这个服务真实的地址是“http://localhost:8000/HelloWorldService”,那么一样元数据交换的地址是“http://localhost:8000/mex”,到这里就完成了对Service的配置工作
1 <host> 2 <baseAddresses> 3 <add baseAddress="http://localhost:8000"/> 4 </baseAddresses> 5 </host>
2:Service行为的配置
<behaviors/>
在<behaviors/>里我们可以指定服务具体的行为,<serviceMetadata httpGetBinding="true"/>是说服务的元数据是否能用Http协议Get出来,也就是说当我们应用了这个配置选项以后,元数据我们是允许Get方法操作的
1 <behaviors> 2 <serviceBehaviors> 3 <behavior name="serviceBehavior"> 4 <serviceMetadata httpGetBinding="true"/> 5 </behavior> 6 </serviceBehaviors> 7 </behaviors>
三:通过元数据生成代理和配置文件
. 我们保存我们在Host这端的配置文件,下面我们启动Host,由于刚才我们在配置文件中已经指明了使用Http协议这么一个服务以及8000它相应的端口,因此在浏览器我们可以通过输入http://localhost:8000/来看到和这个服务相关的具体内容如图一,我们可以使用svcutil.exe这个工具,单击http://localhost:8000/?WSDL看到具体的描述信息在客户端生成相应的Proxyl代码,对个这个WSDL配置文件当中,我们可以看到我们指定的一些信息,像我们使用什么样的协议进行传递等这些信息都在WSDL里面进行了非常详细的描述如图二,我们已在Host这一端添加了相应的配置文件使得Host不但能够对外提供基于Tcp协议位置在localhost端口在9000下的服务如图三,同时也提供基于Http协议位置在localhost端口在8000下的服务,那么我们对比这两个服务的话,通过写代码所作的这些事情事实上我们可以通过配置文件的方式来完成,这也就意味着我们在Host这一端希望对外提供一个服务的时候其实对于这个服务而言是不需要编写任何的代码,我们需要做的是在配置文件当中来完成对这个服务的配置就够了。
. 演示在客户端如何使用在Http协议下提供的这个服务,我们先启动Host,我们进入到Client工程当中,在Client里面添加一个引用,地址是http://localhost:8000/如图四,也就是提供基于Http协议消息的Host,由Visual Studio会根据WSDL里面的内容l来自动生成相应的代理文件以及相应的配置文件如图五。在Reference.svcmap下面有个Reference.cs,在这个Reference.cs里面有由系统自动为我们生成的代理类,在我们进行使用的时候,我们直接使用代理类来进行服务的操作。同样在Client端生成了和Host端相关的的相应的配置文件以及里面的配置信息和配置参数,对于这些参数可以根据我们具体需求来进行具体的配置如图六。现在我们转到Client端由于说系统已经为我们生成好了和这个IHelloWorldService契约相关的Proxyl代码了,因此我们自己手动的代码就不需要了,然后对于Proxyl的使用我们就不需要对通过CreateChannel这种方式来进行调用,我们可以直接Proxy.HelloWorldServiceContractClient proxy = new Proxy.HelloWorldServiceContractClient();通过实例化对象的方式来实例化一个新的Proxyl对象出来就可以了,那我们实例化出来的这个proxyl这个对象就自动包含了契约相关的信息,在Proxyl生成以后我可以调用相应的方法来完成相应的任务,这样就实现了基于Http协议的分布式调用。在WCF当中无论是我们使用基于http协议的消息的传递还是使用基于Tcp协议的消息传递都是遵循同一个模型来开发的,如果说我们开发了一个复杂系统在原来是使用Tcp协议来进行数据传递的,然而在实际部署过程中要改变成Http协议,那么我们可以通过配置的方式修改一些参数就能够项目从使用Tcp协议移植到使用Http协议上面
图一
图二
图三
图四
图五
图六
1:首先启动Host端
2:然后启动Client端
是不和《一步一个脚印学习WCF之WCF概要—WCF服务的创建与调用HelloWorld实例,通过编码方式(四) 》一文中通过编码方式的效果一样