WinVista新技术 WCF开发指南之客户端开发

作者:朱先忠编译
一. 客户端编程

为了调用服务上的操作 , 客户端首先需要把服务合同导入到客户端的本地描述中 。这意味着 , 该服务需要客户端暴露一个标准方法以检索它的元数据-这是通过让服务暴露一个元数据交换(MEX)端点来实现的 。只要服务在宿主上注册至少一个TCP、HTTP或IPC基地址 , 那么 , 这个基于WCF的服务就能够自动地暴露一个MEX端点 。

如果客户端使用WCF , 那么调用操作的普通方法是使用一个代理 。这个代理是一个CLR类 , 它暴露单个描述服务合同的CLR接口 。注意 , 如果该服务支持若干合同 , 那么客户端需要对于每一种合同类型都创建一个相应代理 。代理负责提供与服务的合同相同的操作 , 而且还提供其它方法来管理代理的生命周期和到服务的连接 。该代理完整地封装该服务的每一个方面:服务的位置 , 服务的实现技术及其运行时刻平台和通讯传输 。

你可以使用Visual Studio 2005来导入服务元数据并且生成一个代理 。如果服务是自宿主的 , 那么首先要启动该服务 , 然后从客户端工程的上下文菜单中选择"Add Service Reference…" 。如果服务宿主在IIS或WAS上 , 那么就不需要预启动该服务了 。

有趣的是 , 如果服务是自宿主在与客户端工程同一个方案中的另一个工程中 , 那么你可以在Visual Studio 2005中启动宿主并且仍然添加参考 , 因为不同于大多数工程设置 , 这个选项是无法禁止的(见图6) 。这会导致调出"Add Service Reference"对话框 , 你需要在其中提供服务的基地址(或一个基地址和一个MEX URI)以及包含代理的命名空间 。


图6.你可以使用Visual Studio 2005生成一个代理 。
Visual Studio 2005使用SvcUtil.exe命令行工具 , 并且你可以自己使用它 。主要理由是 , 你可以使用SvcUtil开关所提供的众多的选项 。为了直接使用SvcUtil , 你可以提供给它MEX地址并且 , 作为选择 , 还可以提供一个代理文件名 。默认的代理文件名是实现该服务的服务端类的名字 。例如 , 当把服务MyService宿主在IIS中时 , 简单地运行下列命令行:

 SvcUtil http://localhost/MyService/MyService.svc /out:Proxy.cs

借助于自宿主 , 你可以不受限于仅使用HTTP基地址 。假定自宿主服务注册这些基地址:

http://localhost:8002
net.tcp://localhost:8003
net.pipe://localhost/MyPipe
然后 , 启动宿主 , 则你可以使用任何下列命令之一来生成该代理:

SvcUtil http://localhost:8002/MEX /out:Proxy.cs
SvcUtil http://localhost:8002/ /out:Proxy.cs
SvcUtil net.tcp://localhost:8003/MEX /out:Proxy.cs
SvcUtil net.pipe://localhost/MyPipe /MEX/out:Proxy.cs
该代理类没有对服务实现类的参考 , 而只参考服务暴露的合同 。这个代理可以与一个提供地址和绑定的客户端配置文件一起使用 , 也可以在没有配置文件的情况下使用 。注意 , 每一个代理实例都准确地指向一个端点 , 与之交互的端点在构造时刻提供给代理 。

二. 管理客户端配置

客户端需要知道服务所在地并使用与它的服务相同的绑定;当然 , 也要以代理的形式导入服务合同 。实质上 , 这与在服务的端点处捕获的信息完全一致 。为了反映这一信息 , 客户端配置文件包含关于目标端点的信息并且甚至使用与宿主相同的模式 。

例如 , 列表6(见本文相应下载源码)显示了与一个服务(其宿主是根据列表2进行配置的)进行交互需要的客户端配置文件 。注意 , 在这个客户端配置文件中的合同类型(和命名空间)是由SvcUtil生成的导入的类型(和命名空间 , 如果有的话) , 而不是服务类型和命名空间 。该客户端配置文件可以列出与服务支持一样多的端点 , 并且该客户端可以使用任何其中之一来与该服务交互 。列表7(见本文相应下载源码)展示了客户端配置文件-它匹配显示于列表3中的宿主配置文件 。

推荐阅读