65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在没有已部署 WCF 服务的情况下创建 WCF 客户端代理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (7投票s)

2009年6月17日

CPOL

3分钟阅读

viewsIcon

73177

如何创建 WCF

在工作中,我们目前使用一个非常敏捷的流程,其中包括每 1/4 小时构建一次,这对于一个 WPF 解决方案和一些 Mocks 以及一些 NUnit 测试项目来说非常顺利。然后我们到了必须开始构建 WCF 服务,并让 WPF 项目基于新构建的 WCF 服务项目获取新的服务引用客户端代理的时候。这很容易使用 NANT 来实现,并在 NANT 脚本中连接依赖项,但是我们无法在每次构建时实际部署 WCF 服务,因为我们将 WCF 服务托管在 Windows 服务中。

我们也可以使用 InstallUtil.exe 来自动安装服务,但这会增加我们 CI 构建服务器(又名“Cruise Control”)中已经很复杂的构建安排的复杂性。 我们可以做到,但我们只是想能够创建一个新的服务引用客户端代理。通常,人们会做的是在 Visual Studio 中添加服务引用,如下面的图所示

37322/servicereference.jpg

当您使用 Visual Studio 添加服务引用时,通常需要服务已部署并正在运行,然后将向导指向已部署并正在运行的服务地址,该地址公开了一些元数据,允许向导能够查看有关服务的信息。 然后,这将在 Visual Studio 中创建一堆项目,例如以下内容

37322/ref-thumb.jpg

这些生成的文件之一是服务引用客户端代理。 在这种情况下,它被称为“Reference.cs”,如果我们检查它的一小部分,它包含所有 DataContract / ServiceContract 类定义。

37322/dc-thumb.jpg

这很好,但正如我上面所说,持续构建环境(Cruise Control)需要能够在没有部署服务的情况下创建此服务引用客户端代理类“Reference.cs”。 嗯,我们该怎么做呢。

幸运的是,有一个命令行工具可以作为 NANT 脚本的一部分运行。 这个实用程序叫做“svcutil.exe”,它有很多选项,你可以使用 svcutil.exe /? 开关找到它们。

但为了帮助你,这里是我们为了复制 Visual Studio 向导提供的功能而必须做的事情,仅仅使用 svcutil.exe

这是一个 2 个阶段的操作,阶段如下

从 DLL 创建 WSDL

您可以使用 DLL 本身创建 WSDL,然后可以使用 WSDL 创建服务引用客户端代理类。 这是我们如何做到的。

Switch描述
/d/d:<目录> 在其中创建文件的目录(默认:当前目录)
/reference/reference:<文件路径>:将指定的程序集添加到用于解析类型引用的一组程序集中。
svcutil /directory:c:\SOMEDIRECTORY “<SERVICE CONTRACT DLL PATH>”
/reference:”<DATACONTRACT DLL PATH>”

注意:您可能将所有 ServiceContractDataContract 类都放在一个 DLL 中,因此在这种情况下,您不需要 /reference: 开关,这仅用于链接其他 DLL。

使用 WSDL 创建 WPF 客户端服务引用代理类

一旦我们有了 WSDL,我们就可以使用它来创建一个服务引用客户端代理类。 我们这样做如下

Switch描述
/d/d:<目录> 在其中创建文件的目录(默认:当前目录)
/l语言 C# 或 VB
/out输出文件的名称
/noconfig不要生成客户端层 App.Config 文件
/s/serializable:生成标有 Serializable 属性的类
/ct/collectionType: <类型>:一个完全限定或程序集限定的类型名称,用作从模式生成代码时的集合数据类型。
/ser/serializer: Auto - 自动选择序列化程序。 这尝试使用数据合约序列化程序,如果失败则使用 XmlSerializer
/tcv/targetClientVersion:Version35:生成引用 .NET Framework 程序集 3.5 及之前版本中的功能的代码。
/n/namespace:<string,string>:从 WSDL 或 XML 模式 targetNamespace 到 CLR 命名空间的映射。
/edb/enableDataBinding:在所有数据合约类型上实现 System.ComponentModel.INotifyPropertyChanged interface 以启用数据绑定。
svcutil
/d:c:\SOMEDIRECTORY
c:\SOMEDIRECTORY\*.wsdl c:\SOMEDIRECTORY\*.xsd
/l:C#
/out:Reference.cs
/noconfig
/s
/ct:System.Collections.Generic.List`1
/ser:Auto
/tcv:Version35
/n:*,<THE NAMESPACE TO USE>
/edb

这足以让我们以自动化的方式生成一个新的 WPF 客户端服务引用代理类,而无需部署和运行 WCF 服务。

希望这能帮助到某人。

© . All rights reserved.