Как заставить WCF автоматически генерировать WSDL с необходимыми параметрами метода (minoccurs = "1")? - PullRequest
16 голосов
/ 17 сентября 2009

При использовании 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). Или я ослепну и пропущу что-то очевидное.

Есть какие-нибудь подсказки?

Ответы [ 2 ]

18 голосов
/ 09 августа 2010

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

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

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

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

0 голосов
/ 08 июля 2010

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

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

...