如何为具有共享类型的多个WCF服务生成客户端代码

azh*_*lov 11 c# wcf proxy web-services svcutil.exe

我有多个共享一些数据协定的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 );
}
Run Code Online (Sandbox Code Playgroud)

响应和请求在单独的程序集中定义:

[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; }
}
Run Code Online (Sandbox Code Playgroud)

这些服务以一些微不足道的方式实现,编译,发布 - 让我们现在切换到客户端.

在svcutil命令行中包含这两个服务 - 如下所示:

svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc
Run Code Online (Sandbox Code Playgroud)

将导致大量有关重复数据类型的错误消息,从

错误:导出期间生成的架构存在验证错误:源:行: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
Run Code Online (Sandbox Code Playgroud)

但是,共享类型(例如请求和响应)的定义将在Foo.cs中重复,然后在Bar.cs中重复,从而导致编译器错误.

那么,生成消费此类服务的客户端代码的传统方法是什么

限制:

  • 无法将包含共享类型的程序集发送到客户端(以便它们可以使用svcutil.exe的/ r选项)
  • 不能在Visual Studio中使用"添加服务引用..."命令 - 需要一个svcutil命令行(或另一个命令行工具).

mar*_*c_s 5

好吧,基本上你可以

  • 将您的共享类型放入一个单独的程序集中,客户端在生成客户端代码时可以使用该程序集(您已经将其视为不可能)

或者:

  • 您必须单独为服务生成每个代理,并且每个服务都将获得"请求"和"响应"类的"副本"

要么你可以分享共同的集会 - 或者你不能 - 我真的没有看到任何其他选择.