一起学WCF【4】

来源:互联网 发布:windows vista没人用 编辑:程序博客网 时间:2024/05/01 16:39

创建客户端调用服务

服务被成功寄宿后,服务端就开始了服务调用请求的监听。VS添加服务引用时,在内部帮助我们实现元数据的获取,并借助这些元数据通过SvcUtil.exe自动生成用于服务调用的服务代理相关代码和相应的配置。

在新建的Client项目上单击右键选择“添加服务引用”,在弹出的添加服务引用对话框中的地址栏输入元数据发布的源地址,并指定一个命名空间,确定后VS会生成一系列用于服务调用的代码和配置。

服务引用被添加后,用于客户端的服务契约接口CalculatorService会被生成。它于服务端的Service.Interface的ICalculator是等效的契约接口。

真正被客户端调用的是一个叫做CalculatorServiceClient的类,其基类为System.ServiceModel.ClientBase<CalculatorService>。它同样实现了契约接口CalculatorService,并通过调用从基类继承的Channel属性的相应方法实现4个运算操作方法。

在Client项目中可直接利用添加服务引用生成的服务代理类来调用我们寄宿的CalculatorService服务。我们创建CalculatorServiceClient对象并执行相应方法调用服务操作,代码如下:

using System;

using Client.ServiceReferences;

 

namespace Client

{

    classProgram

    {

        staticvoid Main(string[] args)

        {

           using (CalculatorServiceClient proxy = new CalculatorServiceClient())

            {

                Console.WriteLine("x+y= {2}when x= {0} and y = {1}", 1, 2, proxy.Add(1, 2));

               Console.WriteLine("x-y= {2} when x= {0} and y = {1}", 1, 2,proxy.Subtract(1, 2));

               Console.WriteLine("x*y= {2} when x= {0} and y = {1}", 1, 2,proxy.Multiply(1, 2));

               Console.WriteLine("x/y= {2} when x= {0} and y = {1}", 1, 2,proxy.Divide(1, 2));

            }

        }

    }

}

编译运行。在服务器端开启的情况下运行客户端程序会生成相应的结果。

上述Client中通过服务代理对象进行服务调用,还用一种方法创建服务代理的方法,即通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象。

通过IIS寄宿服务

前面演示了将控制台作为服务宿主的自我寄宿方式,下面说明如何将IIS作为服务的宿主。

创建svc文件

WCF有一个对应的文本文件,扩展名为svc。基于IIS的服务寄宿要求相应的WCF服务具有相应的.svc文件,它部署于IIS中,对WCF服务的调用体现在对.svc文件的访问上。

.svc文件仅仅包含一个%@ServiceHost%指令,它有一个必需的Service属性和一系列可选的属性。

我们在Service项目的根目录下创建一个名为CalculatorService.svc的文本文件,代码如下:

<%@ServcieHostService=”Service.CalculatorService”%>

它只包含Service属性,且被指定为服务的全名(命名空间+类型名称)。

创建Web应用

寄宿在IIS下的WCF服务其实就是一个Web应用,所以需要通过IIS管理器为寄宿的服务创建一个Web应用。我们直接在本地创建一个名为WcfServices的Web应用,并将它的物理地址映射为Service项目的根目录。

通过配置的方式来定义寄宿服务的终结点和用于元数据发布的ServiceMetadataBehavior服务行为,承载Web应用的配置应在Web.config中,在项目根目录下创建它,添加如下所示配置:

<?xml version="1.0"encoding="utf-8" ?>

<configuration>

 <system.serviceModel>

   <behaviors>

     <serviceBehaviors>

       <behavior name="metadataBehavior">

         <serviceMetadata httpGetEnabled="true"/>

       </behavior>

     </serviceBehaviors>

   </behaviors>

   <services>

     <service name="Service.CalculatorService"

              behaviorConfiguration="metadataBehavior">

       <endpoint binding="Service.Interface.ICalculator" />

     </service>

   </services>

 </system.serviceModel>

</configuration>

 

与之前的App.config不同的是,终结点不具有地址,服务行为ServiceMetadaBehavior用于元数据发布时也不具有地址。.svc文件的地址加上?wsdl查询字符串就是元数据的发布地址,在本例中即:http://127.0.0.1/wcfServices/calculatorservice.svc?wsdl,即可查看服务元数据的wsdl文件。

还需要添加System.ServiceModel.dll程序集的引用。还需要把编译输出目录改成\bin而不是bin\debug| release。

在客户端仅需要修改终结点的地址,从而转向对寄宿于IIS下的CalculatorService的访问,该地址为.svc文件的网络地址,即http://127.0.0.1/wcfServices/calculatorservice.svc。

【注】IIS上部署WCF遇到404.3错误解决办法 ,执行C:\Windows\Microsoft.NET\/Framework的ServiceModelReg.exe -i,记得以管理员身份打开cmd运行。

再运行如果出现 Could not load type System.ServiceModel.Activation.HttpModule from assembly System.ServiceModel的错误,在cmd中执行asp_net_regiis.exe -iru。

[ServiceContract]和[OperationContract]特性

自动生成的的WSDL文档有时需要进一步扩展,至少需要为该服务提供一个有意义的名称空间以防止它的名字与其他服务冲突。有时,接口、类和方法的内部代码格式和命名形式不允许或不推荐出现在服务服务描述中。

MSDN中对[ServiceContract]和[OperationContract]特性的成员介绍如下。

参数

说明

CallBackContract

当契约是双工时,读取或设置回调契约的类型

ConfigurationName

获取或设置服务在应用程序配置文件中的名称

HasProtectionLevel

读取一个值,表示此成员是否有一个保护级别

Name

获取或设置WSDL文档中<portType>元素的名称

Namespace

设置或获取WSDL文档中<portType>元素的名称空间

ProtectionLevel

设置对契约的绑定是否支持ProtectionLevel属性

SessionMode

获取或设置会话是否允许,以及是否得到了请求

[ServiceContract]特性的属性同样适应于[OperationContract]特性,如需要进一步控制WSDL文档的生成,需要[OperationContract]的属性。详见MSDN。

原创粉丝点击