9

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

有任何想法吗?

4

1 回答 1

13

只要您的服务合同的名称和 (XML) 命名空间不变 - 可以!WCF 服务实际上并不关心如何实现它们的 .NET 内部结构。

只要客户端使用标准Add Service Reference方法(询问服务的元数据以创建单独的客户端代理)附加到您的服务,这就会起作用 - 在这种情况下,客户端代理不了解任何服务端 .NET命名空间...您可以在服务端更改它们并重新部署您的服务文件 - 客户端将继续工作。

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

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

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

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

于 2011-01-27T14:49:06.740 回答