12

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

Response 和 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 命令行(或其他命令行工具)。
4

5 回答 5

5

嗯,基本上可以

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

或者然后:

  • 您必须分别为服务生成每个代理,并且每个服务将获得自己的“请求”和“响应”类的“副本”

要么您可以共享通用程序集 - 或者您不能- 我真的看不到任何其他选择。

于 2010-01-26T17:26:49.927 回答
4

由于您排除了共享 DTO 程序集(为什么,顺便说一句?),在这种情况下,最简单的选择在不同的 C# 命名空间中生成类型(即两次调用svcutil),并在两者之间映射数据。本质上:将来自两个服务的 DTO 视为巧合相似。

您可以使用 automapper 之类的东西来减少工作,或者您可以从类型 A 序列化并反序列化为类型 B(假设实际的数据命名空间等是相同的)。

于 2010-01-26T17:26:18.070 回答
2

如果您还没有找到解决方案,WSCF Blue 可能会让您更接近解决方案。

http://wscfblue.codeplex.com/

它可以为每种类型生成单独的文件,覆盖后续操作。

于 2010-08-05T11:58:17.977 回答
0

运行客户端实用程序后,您将获得 XXXXService.cs 和 output.config 文件。

如果您观察 XXXXService 类,您将所有内容都放在一个文件中。您可以将它们拆分为单独的 IXXXService 和 XXXService 文件以及 datacontracts 文件。

然后,您可以为第二个服务运行该实用程序,并添加 IXXXService1.cs 和 1XXXService.cs 文件以及可用于共享这两个服务的相同数据合同。

我不确定这是否可以回答您的问题。我有一个可以帮助你的例子。你可以在这里看到更多与 MVC 和 WCF 相关的示例。

于 2010-01-26T17:40:27.163 回答
0

请从以下链接下载 WSCFblue-v1-Walkthrough zip,它可能会帮助您实现它。

http://wscfblue.codeplex.com/releases/view/48529

于 2013-02-28T00:55:16.877 回答