Как я могу заставить WCF автоматически генерировать WSDLS с требуемыми параметрами метода (minoccurs =“1”)?

StackOverflow https://stackoverflow.com/questions/1438623

  •  08-07-2019
  •  | 
  •  

Вопрос

При использовании 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 до тех пор, пока вся цепочка объектов, задействованных в контракте, не будет помечена как таковая.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top