我有多个共享一些数据协定的WCF服务,需要使用svcutil.exe生成客户端代码。我使用两种最明显的方法来解决错误并需要一些帮助。
但首先,这是服务:
[ServiceContract( Namespace = "http://www.me.com/services/" )]
public interface IFooService {
[OperationContract]
Response RunFoo( Request request );
}
[ServiceContract( Namespace = "http://www.me.com/services/" )]
public interface IBarService {
[OperationContract]
Response RunBar( Request request );
}
响应和请求在单独的程序集中定义:
[DataContract( Namespace = "http://www.me.com/shared/" )]
public class Request {
[DataMember]
public int Input { get; set; }
}
[DataContract( Namespace = "http://www.me.com/shared/" )]
public class Response {
[DataMember]
public int Result { get; set; }
}
这些服务以一些微不足道的方式实现,编译,发布 - 让我们现在切换到客户端。
在svcutil命令行中包含这两个服务 - 如下所示:
svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc
将导致大量有关重复数据类型的错误消息,从
错误:导出期间生成的架构存在验证错误: 资源: 行:1列:9087 验证错误:全局元素'http://schemas.microsoft.com/2003/10/Serialization/:anyType'已经宣布了。
并以。结尾
错误:导出期间生成的架构存在验证错误: 资源: 行:1列:12817 验证错误:complexType'http://www.me.com/shared/:Response'已经宣布了。
为每个服务单独生成客户端文件可以避免这些错误:
svcutil /o:Foo.cs http://hostname.com/FooService.svc
svcutil /o:Bar.cs http://hostname.com/BarService.svc
但是,共享类型(例如请求和响应)的定义将在Foo.cs中重复,然后在Bar.cs中重复,从而导致编译器错误。
所以, 什么是生成消费此类服务的客户端代码的传统方法?
限制:
- 无法将包含共享类型的程序集发送到客户端(以便它们可以使用svcutil.exe的/ r选项)
- 不能在Visual Studio中使用“添加服务引用...”命令 - 需要一个svcutil命令行(或另一个命令行工具)。