在WCF中,有没有办法从WSDL中省略/隐藏ServiceOperation或DataMember?

时间:2011-05-18 14:59:54

标签: c# .net wcf wsdl

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

WCF在某些约束条件下具有相当的版本容忍能力as documented in this MSDN article.对于您当前的服务来说,采用其中一些做法可能为时已晚,但您可以通过创建新的ServiceContract接口来完成您想要的操作,从而删除您需要的操作和枚举隐藏。

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