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

时间:2010-01-26 14:30:25

标签: c# wcf namespaces datacontract ambiguous

我创建了许多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?

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

1 个答案:

答案 0 :(得分:4)

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

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

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

是的,正如你所说,你可以将消息类移动到一个单独的程序集,链接它并避免添加引用,然后它将作为一个正确的对象,但仍然在幕后它的消息被传递,序列化和反序列化为这个共享对象。不要考虑对象传递并开始根据消息思考,你会发现你要么遇到两个包装对象,要么你需要链接一个外部程序集。