При использовании 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>
Идентификационное поле в MyComplexType повышено с использованием атрибута DataMemeber IsRequired = "верный" и таким образом представлено как обязательное.
Очевидно довольно неправильно для WSDL определить, что параметр является дополнительным, когда это не, но я не вижу очевидного пути к разметке OperationContract, чтобы вынудить WCF распознать и представить эти параметры как требуется.
Я немного экранирован, там не кажется очевидным способом сделать это (читающий intellisense / MSDN / Google). Или я слепну и пропускаю что-то очевидное.
Какие-либо подсказки?
Я только что написал заметку в блоге на эту тему, поскольку сам столкнулся с этой проблемой на прошлой неделе. В ней объясняется, как можно изменить метаданные, которые WCF генерирует во время выполнения.
Помимо загрузки исходного файла, вам нужно только добавить атрибут к определению вашего контракта. Например, так:
[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
[OperationContract]
int Add(int firstValue, int secondValue);
}
Вот запись в блоге, которая объясняет это более подробно: Controlling WSDL minOccurs with WCF
Убедитесь, что MyComplexType помечен атрибутом [DataContract].
Для моего собственного контракта WCF я обнаружил, что minOccurs = 1 не будет отображаться для IsRequired=true в сгенерированном wsdl до тех пор, пока вся цепочка объектов, замешанных в контракте, не будет помечена как таковая.