Вот такая ошибка может возникнуть, если при использовании SSL не закомментировать строчку в web.config следующего вида:
<endpoint name="HttpsMexEndpoint" address="mex" binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange" />
Когда ее убираешь из файла, ошибка пропадает. Как же настроить всё по-хорошему? Давайте рассмотрим.
Ошибка такая происходит потому что для HttpsMexEndpoint требуется
<serviceMetadata httpGetEnabled = “true” />
Поэтому, если очень хочется получить HttpsMexEndpoint, нам нужно внести несколько правок в web.config и в настройки IIS.
Сначала разберемся с IIS: выбираем наш сайт, заходим в его Authentication feature
Там выставляем настройки – Anonymous Authentication = enabled. Если этого не сделать, будете получать ошибку Security settings for this service require ‘Anonymous’ Authentication but it is not enabled for the IIS application that hosts this service.
Далее выставим правильные настройки в web.config:
Если используется Basic Authentication (типа у вас SSL+аутентификация по имени пользователя и паролю), то нужно запретить анонимам дергать наш сервис, это делается в секции authorization:
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
<configuration>
Далее нужно выставить свойства httpGetEnabled в true
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
Если сейчас оставить всё как есть, сохранить изменения и попытаться просмотреть сервис в браузере, появляется возможность увидеть ошибку The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the HttpGetUrl property is a relative address, but there is no http base address. Either supply an http base address or set HttpGetUrl to an absolute address. Чтобы убрать ее, есть два пути, что собственно и написано в сообщении: либо прописать базовый адрес в элементе system.serviceModel\services\service\host\baseAddresses, либо указать аттрибут HttpGetUrl. Первый вариант не годится в случае если сервис развернут в IIS, поскольку элемент baseAddresses полностью игнорируется:
<baseAddresses>
Represents a collection of baseAddress elements, which are base addresses for a service host in a self-hosted environment
Второй способ универсальнее, поэтому я им и пользуюсь, в итоге элемент serviceMetadata выглядит следующим образом:
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl="http://localhost/BizTalkWcfService/mex" />
На этом web.config можно сохранить – теперь сервис будет корректно выдавать метаданные.