【问题标题】:In WCF, is there a way to omit / hide a ServiceOperation or a DataMember from the WSDL?在 WCF 中,有没有办法从 WSDL 中省略/隐藏 ServiceOperation 或 DataMember?
【发布时间】:2011-10-07 02:02:02
【问题描述】:

我有一个现有的 WCF 服务。在某些时候,有时数据协定中的[OperationContract] 或[DataMember] 会变成[Obsolete]。出于向后兼容性的原因,我不想删除该方法。另一个例子是有时我有一个 Enum,并且想要 [Obsolete] 一个选项,但我不能完全删除它,因为系统/数据库中已经存在包含该值的项目。

无论如何,有没有办法从生成的 WDSL 中省略某些项目?例如:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    string SomeMethod(string x);  // I do want this in the WSDL

    [Obsolete]
    [OperationContract]
    string OldMethod(string x); // I do NOT want this in the WSDL, but I do want it to still work / be callable if an older system tries to call it.
}

【问题讨论】:

  • 保留那个 [DataMember] 与向后兼容性有什么关系?
  • 请记住,这是 2 年前提出的,因此 WCF 已更改,但如果删除了 [DataMember],则 WCF 不会反序列化客户端发送的该属性的任何值。事后看来,更好的方法可能只是找到一种真正的方法来对服务进行版本控制,而不是从 WSDL 中“隐藏”属性或服务,但仍然允许客户端调用它。

标签: c# .net wcf wsdl


【解决方案1】:

没有任何开箱即用的东西可用于执行此操作,但您可以使用 WSDL 导出扩展从服务元数据中删除一些操作。我在http://blogs.msdn.com/b/carlosfigueira/archive/2011/10/06/wcf-extensibility-wsdl-export-extension.aspx 实现了这个场景的示例。

【讨论】:

    【解决方案2】:

    WCF 在某些限制内具有相当的版本控制能力as documented in this MSDN article. 您当前的服务采用其中一些做法可能为时已晚,但您可以通过创建新的 ServiceContract 接口来删除您需要隐藏的操作和枚举来完成您想要的。

    您还需要为新接口创建一个新端点。相同的服务实现可以支持多个接口,只需稍作调整,因此更改不应过于广泛。任何新客户端都将使用新的服务端点,而旧客户端将使用原始端点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多