Alexey Suvorov dev blog

Мой разработческий блог

Archive for Сентябрь 2013

MetadataExchangeClient и Windows authentication

with one comment

В какой то момент встала задача подружить 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 и это даже было бы правильнее с архитектурной точки зрения – не вывешивать свойство наружу, но это не первая жертва подхода «будь проще» во фреймворке.

Written by alexeysuvorov

11.09.2013 at 9:45 пп

Опубликовано в .net, WCF