WCF - Индивидуальное поколение WDSL - PullRequest
4 голосов
/ 05 мая 2011

Я часами пытался выполнить некоторые настройки в поколении wsdl, но безрезультатно. Я застрял в основном потому, что не смог найти четкий образец того, что я хочу сделать (возможно, я что-то упустил).

Давайте перейдем к делу: я хочу настроить сгенерированный WSDL. Наиболее релевантные статьи, которые я нашел, касаются добавления атрибутов к существующим Сервисам для добавления поведения, как эта статья .

Я хочу проанализировать OperationContract и сгенерировать и дополнительно xsd, если требуется.

Мои вопросы:

  • Как добавить или перехватить существующее поколение WSDL без добавления атрибутов ?
  • Как настроить этот компонент в файле конфигурации?

Я не хочу менять способ использования метаданных svcutil.exe , просто добавьте немного ComplexType «на лету» в сгенерированный wsdl.

Спасибо за ваши предложения!

1 Ответ

5 голосов
/ 05 мая 2011

Что вам нужно, это реализовать IWsdlExportExtension.ExportContract, но документация четко гласит:

Метод ExportContract вызывается когда система экспорта метаданных экспорт контракта. Только контракт и реализация поведения поведения IWsdlExportExtension получить Вызов ExportContract. Все поведения реализация IWsdlExportExtension get вызов ExportEndpoint.

Для меня это означает, что этот метод вызывается только тогда, когда он реализуется контрактом или операционным поведением, которое обычно определяется пользовательским атрибутом, но вы также должны иметь возможность назначить эти поведения в пользовательской инициализации. Вот пример расширения WSDL для конечной точки, настроенной из файла конфигурации (конфигурация предлагает только поведения для всей службы и конечных точек). Я считаю (но не проверял), что вы можете сделать подобное расширение, которое будет состоять из:

  • Операция или Контрактное поведение реализуют IWsdlExportExtension и ExportContract
  • Поведение конечной точки, которое будет реализовывать IEndpointBehavior и ApplyDispatchBehavior. В ApplyDispatchBehavior вы будете использовать serviceEndpoint.Contract.Behaviors для добавления поведения контракта или serviceEndpoint.Contract.Operations[x].Behaviors для добавления поведения операции.
  • Вы создадите аналогичный BehaviorExtensionElement для определения вашего нового поведения конечной точки из файла конфигурации.
...