我有多个共享某些数据协定并需要使用svcutil.exe生成客户端代码的WCF服务。我遇到了两个最明显的方法来做到这一点,并需要一些帮助。如何为共享类型的多个WCF服务生成客户端代码
但首先,这里的服务:
[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
将导致大约重复数据类型众多的错误消息,从
Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 9087 Validation Error: The global element ' http://schemas.microsoft.com/2003/10/Serialization/:anyType ' has already been declared.
与
结束Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 12817 Validation Error: The complexType ' http://www.me.com/shared/:Response ' has already been declared.
为每项服务单独生成一个客户端文件避免š这些错误:
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命令行(或另一个命令行工具)。
但它不是一个二者或情况。通过在命令行中指定多个端点为svcutil,您可以生成一组输出文件,以在多个服务中重复使用DTO。无需从服务端重新使用程序集,也不需要每个服务都拥有自己的相同对象的副本。 – Bevan 2010-11-29 22:20:36