В WCF есть способ опустить / скрыть ServiceOperation или DataMember из 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 ответа

Решение

Нет ничего готового для этого, но вы можете использовать расширение экспорта WSDL, чтобы удалить некоторые операции из метаданных службы. Я реализовал пример для этого сценария по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2011/10/06/wcf-extensibility-wsdl-export-extension.aspx.

WCF довольно устойчив к версионированию в некоторых ограничениях, как описано в этой статье MSDN. Вероятно, уже слишком поздно для вашей текущей службы принять некоторые из этих методов, но вы можете выполнить то, что хотите, создав новые интерфейсы ServiceContract, которые удаляют операции и перечисления, которые вам нужно скрыть.

Вам также необходимо создать новую конечную точку для нового интерфейса. Одна и та же реализация сервиса может поддерживать несколько интерфейсов с небольшими изменениями, поэтому изменения не должны быть слишком обширными. Любые новые клиенты будут использовать новую конечную точку службы, в то время как старые клиенты будут использовать исходную конечную точку.

Другие вопросы по тегам