有没有办法更改WCF ServiceContract接口的.NET命名空间,但仍然使WCF服务向后兼容使用旧的(命名空间除外)ServiceContract的客户端?例如,假设我(在vb.net中):
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显示了新的命名空间名称,这似乎是不兼容的。
有什么想法吗?
答案 0 :(得分:13)
只要服务合同的名称和(XML)命名空间不变,请确保! WCF服务实际上并不关心它们如何实现的.NET内部。
只要客户端使用标准Add Service Reference
方法(询问服务的元数据以创建单独的客户端代理)附加到您的服务,这就有效 - 在这种情况下,客户端代理具有<任何服务端.NET命名空间的强大>没有知识 ...您可以在服务端更改这些并重新部署服务文件 - 客户端将继续工作。
您需要进行调整的唯一地方是服务端的配置(如果您在IIS中托管,则在web.config
中,在您的托管服务商app.config
中):
<service>
标记的name=
属性具有服务类'完全限定的.NET类型名称(包括.NET命名空间)
<endpoint>
标记的contract=
属性具有服务合约的完全限定的.NET类型名称(包括.NET命名空间)
这显然不起作用,如果您与服务合同共享一个公共程序集 - 在这种情况下,客户端将绑定到公共程序集中这些合同文件的.NET命名空间,如果这些更改,客户将不再工作..