我可以在不更改服务的情况下更改WCF ServiceContract接口的命名空间吗?

时间:2011-01-27 14:33:57

标签: wcf servicecontract

有没有办法更改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显示了新的命名空间名称,这似乎是不兼容的。

有什么想法吗?

1 个答案:

答案 0 :(得分:13)

只要服务合同的名称和(XML)命名空间不变,请确保! WCF服务实际上并不关心它们如何实现的.NET内部。

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

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

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

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

这显然不起作用,如果您与服务合同共享一个公共程序集 - 在这种情况下,客户端将绑定到公共程序集中这些合同文件的.NET命名空间,如果这些更改,客户将不再工作..