Как я могу заставить WCF автоматически генерировать WSDLS с требуемыми параметрами метода (minoccurs =“1”)?
Вопрос
При использовании WCF и OperationContracts у меня определен следующий метод:
[OperationContract]
[FaultContract(typeof(ValidationFault))]
[FaultContract(typeof(FaultException<ExceptionDetail>))]
int DoSomething(int someId, MyComplexType messageData);
Когда это преобразуется в WSDL средой выполнения WCF, в итоге для параметров someId и MessageData в списке отображается значение с minoccurs="0" (и впоследствии выдается ошибка времени выполнения, если эти параметры отсутствуют).
Если я создам прокси-сервер с помощью 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).Или я слепну и упускаю из виду что-то очевидное.
Есть какие-нибудь зацепки?
Решение
Я только что написал Запись в блоге по этому поводу, поскольку я сам столкнулся с проблемой на прошлой неделе.В нем объясняется, как вы можете изменять метаданные, которые WCF генерирует во время выполнения.
Помимо загрузки исходного файла, вам нужно только добавить атрибут в определение вашего контракта.Вот так:
[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
[OperationContract]
int Add(int firstValue, int secondValue);
}
Вот запись в блоге, которая объясняет это более подробно: Управление WSDL MINOCURS происходит с помощью WCF
Другие советы
Убедитесь, что MyComplexType отмечен атрибутом [DataContract].
Для моего собственного контракта WCF я обнаружил, что minOccurs = 1 не будет отображаться для IsRequired= true в сгенерированном wsdl до тех пор, пока вся цепочка объектов, задействованных в контракте, не будет помечена как таковая.