Как исправить "не удалось найти базовый адрес, который соответствует схеме http" ... в WCF - PullRequest
34 голосов
/ 16 мая 2009

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

41 голосов
/ 30 марта 2011

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

      <!-- 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 голосов
/ 22 июля 2011

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

Во-первых:

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

Во-вторых:

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

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

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

4 голосов
/ 16 мая 2009

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

2 голосов
/ 07 сентября 2011

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

1 голос
/ 22 марта 2012

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

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

0 голосов
/ 19 марта 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 узел там. Это должно каскад для вас.

0 голосов
/ 19 марта 2010

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

0 голосов
/ 18 мая 2009

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

...