Как исправить: не удалось найти базовый адрес, соответствующий схеме 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>

Может ли кто-нибудь пролить свет на то, что происходит и как это исправить?


person Craig Shearer    schedule 16.05.2009    source источник
comment
эй, Крейг, ты исправил эту проблему? Пожалуйста, позвольте мне ... Теперь я столкнулся с той же проблемой :(   -  person Lamps    schedule 14.07.2011
comment
какое-нибудь окончательное решение по этому поводу?   -  person Kiquenet    schedule 28.04.2016


Ответы (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">
person dale    schedule 30.03.2011
comment
Очень хорошо - я менял конечную точку с https на http только для локальной отладки и забыл изменить режим безопасности = Транспорт в режим безопасности = Нет. Фиксированный. - person atconway; 01.10.2011

Мне пришлось сделать две вещи с настройкой IIS для сайта / приложения. Моя проблема была связана с тем, что net.tcp работал в приложении веб-сайта IIS:

Первый:

  1. Щелкните правой кнопкой мыши имя приложения IIS.
  2. Управление веб-сайтом
  3. Расширенные настройки
  4. Установите для Включенных протоколов значение «http, net.tcp».

Второй:

  1. В меню Действия в правой части Диспетчера щелкните Привязки ...
  2. Нажмите кнопку "Добавить".
  3. Измените тип на "net.tcp"
  4. Установите для информации привязки значение {номер открытого порта}: *
  5. OK
person ZaChickster    schedule 21.07.2011

Есть ли шанс, что ваш IIS настроен на требование SSL при подключении к вашему сайту / приложению?

person tomasr    schedule 16.05.2009
comment
Я получаю ту же ошибку, @tomasr и IIS настроены на использование SSL. Будет ли это проблемой? Есть ли способ обойти это? - person StatsStudent; 11.10.2017

Если вы хотите использовать baseAddressPrefixFilters в web.config, вам также необходимо настроить IIS (6). Мне это помогло:

1 / В IIS найдите свой сайт. 2 / Свойства / Веб-сайт (вкладка) / IP-адрес -> кнопка «Дополнительно» 3 / Добавить новый заголовок узла на тот же порт, который вы будете использовать в web.config.

person LiborBes    schedule 12.05.2010

Будет принят только первый базовый адрес в списке (поступающий от IIS). У вас не может быть нескольких базовых адресов для схемы до .NET4.

person Ákos    schedule 07.09.2011

Решение состоит в том, чтобы определить настраиваемую привязку в файле Web.Config и установить режим безопасности «Транспорт». Затем вам просто нужно использовать свойство bindingConfiguration внутри определения конечной точки, чтобы указать на настраиваемую привязку.

См. Здесь: Блог Скотта: WCF Необходимые привязки для HTTPS

person fiberOptics    schedule 22.03.2012

Если он размещен в IIS, нет необходимости указывать базовый адрес, это будет адрес виртуального каталога.

person Philippe    schedule 18.05.2009

Должен быть способ довольно легко решить эту проблему с помощью разделов внешней конфигурации и дополнительного шага развертывания, который переносит внешний файл .config, связанный с развертыванием, в известное место. Обычно мы используем это решение для обработки различных конфигураций серверов для наших различных сред развертывания (промежуточная, QA, производственная и т. Д.) С нашим «блоком разработчика» по умолчанию, если не происходит специальной копии.

person Eric Willeke    schedule 19.03.2010

Подтвердил мое исправление:

В вашем файле 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. Он должен каскадироваться за вас.

person Eric Willeke    schedule 19.03.2010