Как исправить "не удалось найти базовый адрес, который соответствует схеме http"... в WCF
Я пытаюсь развернуть службу WCF на моем сервере, размещенном в IIS. Естественно это работает на моей машине:)
Но при развертывании я получаю следующую ошибку:
Эта коллекция уже содержит адрес со схемой http. В этой коллекции может быть не более одного адреса на схему.
Погуглив на этом, я обнаружил, что мне нужно поместить элемент serviceHostingEnvironment в файл web.config:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://mywebsiteurl"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Но как только я это сделаю, я получу следующее:
Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой BasicHttpBinding. Схемы зарегистрированных базовых адресов: [https].
Кажется, он не знает, что такое базовый адрес, но как мне его указать? Вот соответствующий раздел моего файла web.config:
<system.serviceModel>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://mywebsiteurl"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<behaviors>
<serviceBehaviors>
<behavior name="WcfPortalBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IWcfPortal"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
receiveTimeout="00:10:00" sendTimeout="00:10:00"
openTimeout="00:10:00" closeTimeout="00:10:00">
<readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647"
maxStringContentLength="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal">
<endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal"
bindingConfiguration="BasicHttpBinding_IWcfPortal">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Кто-нибудь может пролить свет на то, что происходит и как это исправить?
9 ответов
Попробуйте изменить режим безопасности с "Транспорт" на "Нет".
<!-- Transport security mode requires IIS to have a
certificate configured for SSL. See readme for
more information on how to set this up. -->
<security mode="None">
Мне пришлось сделать две вещи для конфигурации IIS сайта / приложения. Моя проблема была связана с тем, чтобы net.tcp работал в приложении веб-сайта IIS:
Первый:
- Щелкните правой кнопкой мыши на имени приложения IIS.
- Управление веб-сайтом
- Расширенные настройки
- Установите для включенных протоколов значение "http, net.tcp"
Во-вторых:
- В меню "Действия" в правой части диспетчера выберите "Привязки".
- Нажмите кнопку Добавить
- Измените тип на "net.tcp"
- Задайте для информации привязки {открытый номер порта}:*
- Хорошо
Есть ли вероятность, что ваш IIS настроен на использование SSL при подключении к вашему сайту / приложению?
Если вы хотите использовать baseAddressPrefixFilters в web.config, вы должны также настроить IIS (6). Это помогло мне:
1 / В IIS найдите ваш сайт. 2/ Свойства / Веб-сайт (вкладка) / IP-адрес -> кнопка "Дополнительно" 3/ Добавьте новый заголовок узла на тот же порт, который вы будете использовать в web.config.
Только первый базовый адрес в списке будет принят (из IIS). Вы не можете иметь несколько базовых адресов на схему до.NET4.
Решение состоит в том, чтобы определить пользовательскую привязку внутри вашего файла Web.Config и установить режим безопасности "Транспорт". Затем вам просто нужно использовать свойство bindingConfiguration внутри определения конечной точки, чтобы указать на пользовательскую привязку.
Смотрите здесь: Блог Скотта: привязки WCF необходимы для HTTPS
Должен быть способ легко решить эту проблему с помощью внешних разделов конфигурации и дополнительного шага развертывания, при котором внешний файл.config для конкретного развертывания помещается в известное место. Как правило, мы используем это решение для обработки различных конфигураций серверов для наших различных сред развертывания (Staging, QA, production и т. Д.), При этом наш "dev box" используется по умолчанию, если не происходит специального копирования.
Подтвердил мое исправление:
В вашем файле web.config вы должны настроить его так:
<system.serviceModel >
<serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" />
...
Затем создайте структуру папок, которая выглядит следующим образом:
/web.config
/Configurations/ServiceHosting.config
/Configurations/Deploy/ServiceHosting.config
Базовый serviceHosting.config должен выглядеть так:
<?xml version="1.0"?>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
в то время как в /Deploy выглядит так:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://myappname.web707.discountasp.net"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Помимо этого, вам нужно добавить шаг ручного или автоматического развертывания, чтобы скопировать файл из /Deploy поверх файла в /Configurations. Это работает невероятно хорошо для служебного адреса и строк подключения и экономит усилия, делая другие обходные пути.
Если вам не нравится этот подход (который хорошо масштабируется для ферм, но слабее на одной машине), вы можете рассмотреть возможность добавления файла web.config на уровень выше развертывания службы на машине хоста и размещения там узла serviceHostingEnvironment. Это должно каскад для вас.
Если он размещен в IIS, нет необходимости указывать базовый адрес, это будет адрес виртуального каталога.