我创建了许多WCF服务,但为了论证,它们被称为 Service1 和 Service2 。
两个服务都返回(在某个时候,可能通过对象内部的关系) Customer 对象。
为了测试,我在Service1和Service2中添加了一个 GetCustomer()方法,我在基本的WinForms应用程序中为这两个服务添加了一个服务引用。
Service1Client proxy1 = new Service1Client();
客户customer1 = proxy1.GetCustomer(); //
^^^^^^不明确的引用,要求我命名为WcfTestClient.Service1.Customer
Service2Client proxy2 = new Service2Client();
客户customer2 = proxy2.GetCustomer();
^^^^^不明确的引用,要求我命名为WcfTestClient.Service2.Customer
问题是, Service1 和 Service2 返回的Customer对象都是相同类型的Customer(WcfTestService.Customer)。为了解决这个问题,我需要包括完整的程序集名称,而不仅仅是Customer。
我已经阅读了Stack Overflow上的一些帖子,说明可以将数据合同编译成一个单独的程序集,我不是特别喜欢这个想法,因为它可能仍然会导致使用其他语言的客户端出现问题,例如Java
我看到的另一个解决方案是SvcUtil.exe方法,但从我所看到的这个解决方案没有解决我的命名空间问题,因为我需要为每个服务单独运行Util?
如果有人有任何有用的建议,请与我们联系!
答案 0 :(得分:4)
两个服务都返回(在某些时候,可能通过对象内部的关系)一个Customer对象。
这是你错的地方。 WCF不返回对象,REST不返回对象,SOAP不返回对象。它们都传递消息。
现在,当您添加对Web服务的引用时会发生什么,Visual Studio很乐意为这些消息创建一个包装类,将其内容作为属性公开,仅此而已。因为您要添加两个服务,所以这些包装类彼此不了解,因此您最终会得到两个名称空间和两个包装类。
是的,正如你所说,你可以将消息类移动到一个单独的程序集,链接它并避免添加引用,然后它将作为一个正确的对象,但仍然在幕后它的消息被传递,序列化和反序列化为这个共享对象。不要考虑对象传递并开始根据消息思考,你会发现你要么遇到两个包装对象,要么你需要链接一个外部程序集。