在 WCF 中,有没有办法从 WSDL 中省略/隐藏服务操作或数据成员

本文关键字:隐藏 服务 操作 数据成员 中省 WSDL WCF 有没有 | 更新日期: 2023-09-27 17:56:43

我有一个现有的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.
}

在 WCF 中,有没有办法从 WSDL 中省略/隐藏服务操作或数据成员

没有任何现成的东西可以用来

执行此操作,但您可以使用 WSDL 导出扩展从服务元数据中删除某些操作。我在 http://blogs.msdn.com/b/carlosfigueira/archive/2011/10/06/wcf-extensibility-wsdl-export-extension.aspx 为这个方案实现了一个示例。

WCF 在某些约束中具有很好的版本控制容错能力,如本 MSDN 文章中所述。对于您当前的服务来说,采用其中一些做法可能为时已晚,但您可以通过创建新的 ServiceContract 接口来完成您想要的,这些接口删除了您需要隐藏的操作和枚举。

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