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

标签 wcf servicecontract

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

有任何想法吗?

最佳答案

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

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

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

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

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

    关于wcf - 我可以在不更改服务的情况下更改 WCF ServiceContract 接口(interface)的命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4817635/

    相关文章:

    .net - 从 IClientMessageInspector 获取请求 URI

    c# - 无法加载文件或程序集 'Microsoft.VisualStudio.Services.Common,版本 = 12.0

    c# - 无法使用基本身份验证访问 WCF Web 服务

    c# - 在 WCF Rest 端点中使用参数 "params string[]"

    c# - 在运行时提供 ServiceKnownType?

    wcf - 在 ServiceModel 客户端配置部分找不到名称为 ' and contract ' I' 的端点元素。

    .net - 从 WCF 服务获取实体

    WCF DataContract 排除 DataMembers 在派生类中被序列化

    c# - 服务合约中的构造函数逻辑

    c# - 将 WCF 协议(protocol)转换为类