Как я могу вынудить WCF автоматически сгенерировать WSDLs с параметрами требуемого метода (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>

Идентификационное поле в MyComplexType повышено с использованием атрибута DataMemeber IsRequired = "верный" и таким образом представлено как обязательное.

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

Я немного экранирован, там не кажется очевидным способом сделать это (читающий intellisense / MSDN / Google). Или я слепну и пропускаю что-то очевидное.

Какие-либо подсказки?

16
задан John Saunders 17 September 2009 в 14:40
поделиться

2 ответа

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

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

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

Вот запись в блоге, которая объясняет это более подробно: Controlling WSDL minOccurs with WCF

18
ответ дан 30 November 2019 в 22:31
поделиться

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

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

0
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: