3

我创建了许多 WCF 服务,出于参数考虑,它们被称为Service1Service2

这两个服务都返回(在某些时候,可能通过对象内部的关系)一个客户对象。

为了测试起见,我向 Service1 和 Service2添加了GetCustomer()方法,并且在基本的 WinForms 应用程序中添加了对这两个服务的服务引用。

Service1Client proxy1 = new Service1Client();

客户 customer1 = proxy1.GetCustomer(); //

^^^^^^ 不明确的引用,需要我命名为 WcfTestClient.Service1.Customer

Service2Client proxy2 = new Service2Client();

客户 customer2 = proxy2.GetCustomer();

^^^^^ 不明确的引用,需要我命名为 WcfTestClient.Service2.Customer

问题是,Service1Service2返回的 Customer 对象都是同一类型的 Customer (WcfTestService.Customer)。为了解决这个问题,我需要包含完整的程序集名称而不仅仅是客户。

我在 Stack Overflow 上阅读了几篇文章,指出可以将数据契约编译成单独的程序集,但我并不特别喜欢这个想法,因为它可能仍然会导致客户端使用其他语言(例如 Java)时出现问题。

我看到的另一个解决方案是 SvcUtil.exe 方法,但据我所知,这个解决方案并没有解决我的命名空间问题,因为我需要为每个服务单独运行 Util?

如果有人有任何有用的建议,请与我们联系!

4

1 回答 1

4

这两个服务都返回(在某些时候,可能通过对象内部的关系)一个客户对象。

这就是你错的地方。WCF 不返回对象,REST 不返回对象,SOAP 不返回对象。他们都传递消息

现在,当您添加对 Web 服务的引用时,Visual Studio 会愉快地为这些消息创建一个包装类,将它们的内容作为属性公开,仅此而已。因为您要添加两个服务,所以这些包装类彼此不了解,因此您最终会得到两个命名空间和两个包装类。

是的,正如您所说,您可以将消息类移动到一个单独的程序集中,链接它并避免添加引用,然后它将作为一个适当的对象,但仍然在幕后它是消息被传递、序列化和反序列化到这个共享对象中。停止考虑对象传递并开始考虑消息,您会意识到您要么被两个包装对象困住,要么需要链接外部程序集。

于 2010-01-26T14:36:31.307 回答