【问题标题】:Can I change namespace of WCF ServiceContract interface without changing the service?我可以在不更改服务的情况下更改 WCF ServiceContract 接口的命名空间吗?
【发布时间】:2011-01-27 14:33:56
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: wcf servicecontract


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我没有使用“添加服务参考”——它给出了意想不到的结果——见stackoverflow.com/questions/1294269/…。也许这无论如何都会起作用?我会尽快尝试。
    • @Patrick Szalapski:好吧,在这种情况下,您可能在服务和客户端之间共享合同组件,对吧?在这种情况下,当然,更改服务合同上的命名空间影响客户端 - 无法绕过它。
    • 这个explanation 为我澄清了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2018-10-18
    • 1970-01-01
    • 2012-05-22
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多