Подтвердить что ты не робот

Как заставить WCF автоматически генерировать WSDL с требуемыми параметрами метода (minoccurs = "1" )?

При использовании WCF и OperationContracts я определяю следующий метод:

    [OperationContract]
    [FaultContract(typeof(ValidationFault))]
    [FaultContract(typeof(FaultException<ExceptionDetail>))]
    int DoSomething(int someId, MyComplexType messageData);

Когда это переводится в WSDL с помощью среды выполнения WCF, она заканчивается с minoccurs = "0", указанным для параметров someId и messageData (и впоследствии выдает ошибку времени выполнения, если эти параметры отсутствуют).

Если я создаю прокси-сервер с помощью SoapUI, я получаю что-то похожее на это:

  <com:DoSomething>
     <!--Optional-->
     <com:EventId>1</com:EventId>
     <!--Optional-->
     <com:myComplexType >
        <com:id>1</com:id>
     </com:myComplexType >
  </com:DoSomething>

Поле id в MyComplexType помечено атрибутом DataMemeber с использованием IsRequired = "true" и поэтому отображается как обязательное.

Очевидно, что для WSDL достаточно указать, что параметр является необязательным, если это не так, но я не вижу никакого очевидного способа разметки OperationContract, чтобы заставить WCF распознавать и подвергать эти параметры по мере необходимости.

Я немного озадачен, нет очевидного способа сделать это (читая intellisense/msdn/google). Или я буду слепым и не замечаю ничего очевидного.

Любые подсказки?

4b9b3361

Ответ 1

Я только что написал пост в блоге об этой теме, так как я столкнулся с проблемой на прошлой неделе. В нем объясняется, как вы можете изменять метаданные, которые генерирует WCF во время выполнения.

Помимо загрузки исходного файла, вам нужно добавить атрибут в определение контракта. Например:

[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
    [OperationContract]
    int Add(int firstValue, int secondValue);
}

Здесь сообщение в блоге, которое объясняет это более подробно: Управление WSDL minOccurs с WCF

Ответ 2

Убедитесь, что MyComplexType отмечен атрибутом [DataContract].

Для моего собственного контракта WCF я обнаружил, что minOccurs = 1 не будет отображаться для IsRequired = true в сгенерированном wsdl до тех пор, пока вся цепочка объектов, участвующих в контракте, не будет помечена как таковая.