Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Во-первых:

  • Щелкните правой кнопкой мыши на имени приложения IIS.
  • Управление веб-сайтом
  • Дополнительные параметры
  • Установите Enabled protocol как "http, net.tcp"

Во-вторых:

  • В меню "Действия" в правой части диспетчера нажмите "Привязки"...
  • Нажмите "Добавить"
  • Изменить тип на "net.tcp"
  • Установите обязательную информацию для {open port number}: *
  • OK

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

В файле web.config вы должны настроить его как таковой:

<system.serviceModel >
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" />
    ...

Затем создайте структуру папок, которая выглядит так:

/web.config
/Configurations/ServiceHosting.config
/Configurations/Deploy/ServiceHosting.config

Базовая службаHosting.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>

Кроме того, вам нужно добавить ручной или автоматический шаг развертывания, чтобы скопировать файл из/Развернуть на верхнюю панель в/Конфигурации. Это работает невероятно хорошо для служебных адресов и строк соединений, а также позволяет сэкономить усилие, выполняя другие обходные пути.

Если вам не нравится этот подход (который хорошо масштабируется для ферм, но слабее на одной машине), вы можете подумать о добавлении файла web.config на уровне от развертывания службы на главной машине и поместить службуHostingEnvironment node там. Он должен каскадироваться для вас.