Archive for Сентябрь 2013
MetadataExchangeClient и Windows authentication
В какой то момент встала задача подружить MetadataExchangeClient и WCF сервис работающий на сайте с windows аутентификацией. «Дружба» приложения с сервисом происходила в 2 этапа: 1 – прочитать контракт 2 – читать/передавать данные. С этапом 2 всё решилось добавление секции security в байндинг, но вот с этапом 1 возникли неожиданные трудности.
Читать метаданные можно несколькими способами, но самый простой с точки зрения и сервера и клиента выглядит так:
var metaTransfer = new MetadataExchangeClient(); var metadataSet = metaTransfer.GetMetadata(url, MetadataExchangeClientMode.HttpGet);
Читает метаданные без настройки mex эндпоинта на стороне сервера, но есть один нюанс. Если сосредоточится и передать в конструктор MetadataExchangeClient экземпляр httpBinding с правильно настроенными параметрами безопасности, то ничего не случится. Точнее случится попытка неавторизованного доступа и исключение. Самое правильное место — это свойство HttpCredentials куда нужно передать что нибудь вроде CredentialCache.DefaultCredentials
var metaTransfer = new MetadataExchangeClient(); metaTransfer.HttpCredentials = CredentialCache.DefaultCredentials; var metadataSet = metaTransfer.GetMetadata(url, MetadataExchangeClientMode.HttpGet);
А можно было бы и виртуальный метод переопределить, который возвращает HttpWebRequest и это даже было бы правильнее с архитектурной точки зрения – не вывешивать свойство наружу, но это не первая жертва подхода «будь проще» во фреймворке.