Как заставить 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). Или я буду слепым и не замечаю ничего очевидного.
Любые подсказки?
Ответы
Ответ 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 до тех пор, пока вся цепочка объектов, участвующих в контракте, не будет помечена как таковая.