2011-01-27 56 views
8

有没有办法更改WCF ServiceContract接口的.NET名称空间,但是仍然使WCF服务向后兼容使用旧的(与命名空间完全相同)ServiceContract的客户端?例如,假设我有(在vb.net):我可以在不更改服务的情况下更改WCF ServiceContract接口的名称空间吗?

Namespace MyCompany.MyPoorlyNamedProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
EndNamespace 

而且我想改变这种状况,以

Namespace MyCompany.MyProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
End Namespace 

,而完全不改变服务。

我试过这样做,但是我从wsdl引用的xsds显示了新的名称空间名称,这似乎是不兼容的。

任何想法?

回答

12

只要您的服务合同的名称和(XML)名称空间不会更改 - 当然! WCF服务真的不关心.NET内部如何实现它们。

这个工作,只要客户端连接到使用标准Add Service Reference方法(询问该服务的元数据来创建一个单独的客户端代理)服务 - 在这种情况下,客户端代理具有没有知识任何服务端.NET命名空间......您可以更改服务端的这些名称并重新部署您的服务文件 - 客户端将继续工作。

唯一的地方,你需要做出的调整是在服务端的配置(以web.config如果你在IIS托管,在您的托管商的app.config否则):

  • <service>标签的name=属性有服务类的完全限定.NET类型名(包括.NET命名空间)

  • <endpoint>标签的contract=属性有服务合同的完全限定.NET类型名(包括.NET命名空间)

这不起作用,很明显,如果您与服务合同共同组件 - 在这种情况下,客户端将被捆绑到这些合同文件的.NET命名空间在一个共同的组装和如果这些变化,客户端将不再工作..

+0

+1为完整答案 – vlad 2011-01-27 15:16:42

相关问题