C# 具有多个服务和命名空间问题的WCF

C# 具有多个服务和命名空间问题的WCF,c#,wcf,namespaces,datacontract,ambiguous,C#,Wcf,Namespaces,Datacontract,Ambiguous,我已经创建了许多WCF服务,为了参数起见,它们被称为Service1和Service2 这两个服务都返回(在某个点上,可能通过对象内部的关系)一个Customer对象 为了测试起见,我向Service1和Service2添加了一个GetCustomer()方法,并在基本WinForms应用程序中向这两个服务添加了一个服务引用 Service1Client proxy1=新Service1Client() Customer customer1=proxy1.GetCustomer()// ^^^

我已经创建了许多WCF服务,为了参数起见,它们被称为Service1和Service2

这两个服务都返回(在某个点上,可能通过对象内部的关系)一个Customer对象

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

Service1Client proxy1=新Service1Client()

Customer customer1=proxy1.GetCustomer()//

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

Service2Client proxy2=新的Service2Client()

Customer customer2=proxy2.GetCustomer()

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

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

我读过几篇关于堆栈溢出的文章,其中指出可以将数据契约编译成单独的程序集,我并不特别喜欢这种想法,因为它仍然可能导致使用其他语言(如Java)的客户端出现问题

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

如果有任何有用的建议,请联系

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

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

现在,当您添加对web服务的引用时,VisualStudio很高兴地为这些消息创建一个包装类,将其内容作为属性公开,仅此而已。因为您要添加两个服务,所以这些包装器类彼此不了解,因此最终会得到两个名称空间和两个包装器类


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

blowdart,刚刚尝试了你的解决方案(数据契约在一个单独的程序集中),它似乎工作得很好。非常感谢:-)只是出于兴趣,这意味着我不会在我的类上使用[DataContract]和[DataMember]注释,你知道这样做的后果吗?我会把它们放在上面,因为它仍然控制消息的形状,什么是可选的等等。它们仍然用于创建消息。您刚刚正在共享该实现