Предоставление метаданных WCF на защищенном сайте SiteMinder - PullRequest
1 голос
/ 29 июля 2011

Это может быть действительно глупый вопрос, но я не смог найти решение. У меня есть служба WCF, размещенная на сайте, который использует аутентификацию SiteMinder. Аутентификация опирается на cookie в запросе клиента. Проблема в том, что когда я пытаюсь сгенерировать прокси-класс с помощью svcutil, операция завершается неудачно, потому что, когда svcutill пытается получить метаданные, он явно не добавляет cookie SiteMinder в свой запрос. Поэтому мне было интересно, существует ли простой способ программной генерации прокси-класса службы WCF.

1 Ответ

1 голос
/ 29 июля 2011

Если у вас есть доступ к скомпилированному файлу DLL службы, вы можете использовать утилиту командной строки SvcUtil для генерации WSDL и связанных XSD для контрактов данных. Основной недостаток этого подхода заключается в том, что вам необходимо добавить имя файла XSD, сгенерированного SvcUtil, в каждый элемент xsd: import в значение атрибута schemaLocation.

Ниже приведены примеры модифицированных элементов xsd: import. Для пространства имен «http://tempuri.org/"» я добавил атрибут schemaLocation со значением «tempuri.org.xsd», чтобы процесс «Добавление справочника услуг» знал, что ищет этот файл в той же папке, что и файл WSDL. ваш WSDL использует вместо этого wsdl: import, добавьте атрибут location вместо атрибута schemaLocation. Этот связанный вопрос и ответ должны дать хорошее начало.

  <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
      <xsd:import namespace="http://tempuri.org/" schemaLocation="tempuri.org.xsd" />
      <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" schemaLocation="schemas.microsoft.com.2003.10.Serialization.xsd" />
    </xsd:schema>
  </wsdl:types>

EDIT:

Генерация клиентского кода с использованием скомпилированной служебной DLL требует двухэтапного процесса. SvcUtil нужен сервис WSDL для генерации клиента. Он не может напрямую использовать скомпилированную DLL.

Сначала сгенерируйте WSDL с помощью библиотеки DLL, содержащей ServiceContract. Я думаю, что вы можете использовать файл реализации сервиса, если DLL контракта сервиса также находится в той же папке.

cd "\Path\To\Your\Service\DLLs"
svcutil YourService.DLL

Это создаст несколько файлов в зависимости от структуры вашего сервиса. Там будет один файл .WSDL и несколько файлов .XSD. Отредактируйте эти файлы, как показано выше.

Наконец, либо используйте диалоговое окно «Добавить ссылку на службу Visual Studio», чтобы выбрать отредактированный файл .WSDL (просто введите полный путь и имя файла), чтобы сгенерировать код клиента, либо используйте SvcUtil следующим образом:

svcutil *.wsdl *.xsd /language:C#
...