Как исправить "не удалось найти базовый адрес, соответствующий схеме http" ... в WCF

Asked
Viewd99381

34

Я пытаюсь развернуть службу 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 ответов

2

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

44

Попробуйте изменить режим безопасности с «Транспортный» на «Нет».

       <!-- 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">
 
4

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

1

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

См. здесь: Scott's Блог: привязки WCF необходимы для HTTPS

4

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

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

0

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

5

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

Первое:

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

Второй:

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

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

0

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

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