使用svcutil.exe生成代理代码
25.9 构建WCF客户应用程序
现在已经设置好主机,最后一个任务是构建用于与这个WCF服务类型通信的软件部分。虽然可以手动执行大量工作并构建必要的基础结构(可行但需要大量劳动的任务),但是.NET Framework 3.5 SDK提供了一些方法来快速生成客户端代理。首先,创建名为MagicEightBallServiceClient的新控制台应用程序。
25.9.1 使用svcutil.exe生成代理代码
构建客户端代理的第一种方法是通过Visual Studio 2008命令提示符使用svcutil.exe命令行工具。通过使用svcutil.exe,可以生成表示代理代码自身以及客户端配置文件的新VB语言文件。为了执行该操作,只需要指定作为第一个形参的服务端点。/language:标记允许指定希望生成VB代码(而不是默认的C#代码)。/out:标记用于定义包含代理的*.vb文件的名称,而/config:选项指定生成的客户端*.config文件的名称。
假设您的服务当前正在运行,传入svcutil.exe的如下命令集将在工作目录中生成两个新的文件(当然,该命令集在Visual Studio 2008命令提示符中应该作为一行输入):
- svcutil http://localhost:8080/MagicEightBallService
- /language:VB /out:myProxy.vb /config:app.config
如果打开myProxy.vb文件,就会看到IEightBall接口的客户端表示,以及作为代理类的名为EightBallClient的新类。该类派生自泛型类System.ServiceModel.ClientBase(Of T),其中T是已注册的服务接口(也就是IEightBall)。
除了许多自定义的构造函数之外,将会实现服务接口中使用<OperationContract()>属性修饰的每个方法,从而委托给父类的Channel特性以调用正确的外部方法。下面是该代理类型的部分代码:
- <System.Diagnostics.DebuggerStepThroughAttribute(), _
- System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", _
- "3.0.0.0")> _
- Partial Public Class EightBallClient
- Inherits System.ServiceModel.ClientBase(Of IEightBall)
- Implements IEightBall
- ...
- Public Function ObtainAnswerToQuestion(ByVal userQuestion As String) _
- As String Implements IEightBall.ObtainAnswerToQuestion
- Return MyBase.Channel.ObtainAnswerToQuestion(userQuestion)
- End Function
- End Class
在创建该代理类型的实例时,基类将使用在客户端应用程序配置文件中指定的设置建立端点的连接。非常类似于服务器端的配置文件,生成的客户端App.config文件包含<endpoint>元素和用于与服务通信的basicHttpBinding的相关细节。
此外,您将看到如下的<client>元素,该元素再次从客户的角度建立ABC:
- <client>
- <endpoint
- address="http://localhost:8080/MagicEightBallService"
- binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IEightBall"
- contract="IEightBall" name="BasicHttpBinding_IEightBall" />
- </client>
到目前为止,可以在项目中包括这两个文件(以及引用System.ServiceModel.dll程序集),并且使用代理类型与远程WCF服务通信。然而,此处并没有这样做,而是介绍Visual Studio 2008如何帮助进一步自动化客户端代理文件的创建。