Ошибка запуска службы WCF "Эта коллекция уже содержит адрес со схемой http"

Я построил веб-приложение, содержащее контракт службы WCF, и элемент управления Silverlight, который вызывает вызовы этой службы WCF. На моих серверах разработки и тестирования он отлично работает.

Когда я развертываю на наш живой сервер и запускаю приложение, я получаю исключение типа System.ServiceModel.ServiceActivationException, в котором говорится, что услуга не может быть активирована из-за исключения во время компиляции. Исключение составляет:

В этой коллекции уже содержится адрес со схемой http. В этой коллекции может быть не более одного адреса для каждой схемы.

Я читал, что это исключение может быть выбрано, если на веб-сайте имеется более одного заголовка хоста, что верно на нашем реальном сервере. Очевидно, что службы WCF, размещенные в IIS, могут иметь только один базовый адрес. Как я могу обойти эту проблему?

Ответ 1

Резюме

Решение для кода: Здесь

Конфигурационные решения: Здесь

С помощью Майка Чалия я нашел несколько решений о том, как это сделать с помощью кода. Поскольку эта проблема будет затрагивать почти все проекты, которые мы развертываем, в живую среду, я выступал за чисто конфигурационное решение. В итоге я нашел информацию о том, как это сделать в .net 3.0 и .net 3.5.

Взятый с сайта, ниже приведен пример того, как изменить свои приложения в веб-конфигурации:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

В приведенном выше примере, net.tcp://payroll.myorg.com: 8000 и http://shipping.myorg.com:9000 - это только базовые адреса, для их соответствующие схемы, которые будут позволили пройти. baseAddressPrefixFilter не поддержка любых подстановочных знаков.

БазовыеAddresses, предоставленные IIS, могут имеют адреса, связанные с другими схемами нет в базеAddressPrefixFilter список. Эти адреса не будут отфильтровывается.

Решение Dns (непроверено): Я думаю, что если бы вы создали новую запись dns, специфичную для вашего веб-приложения, добавили новый веб-сайт и дали ему один заголовок узла, соответствующий записи dns, вы бы полностью устранили эту проблему и не должны были писать собственный код или добавьте префиксы в файл web.config.

Ответ 3

Вы видели это - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Вы можете устранить эту ошибку, изменив файл web.config.

С ASP.NET 4.0 добавьте следующие строки в ваш web.config:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

С ASP.NET 2.0/3.0/3.5 добавьте следующие строки в ваш web.config:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

Ответ 4

В моем случае первопричиной этой проблемы было несколько привязок HTTP, определенных на родительском веб-сайте, то есть InetMgr- > Sites- > Mysite- > properties- > EditBindings. Я удалил одну привязку http, которая не требовалась, и проблема была решена.

Ответ 5

И в моем случае это было просто: я использовал мастер "Добавить WCF Service" в Visual Studio, который автоматически создал соответствующие разделы в app.config. Затем я продолжил чтение Как разместить службу WCF в управляемом приложении. Проблема была: мне не нужно было указывать URL-адрес для запуска веб-службы.

Заменить:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

С

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

И ошибка исчезла.

Общая идея: если вы укажете базовый адрес в качестве параметра и укажите его в config, вы получите эту ошибку. Скорее всего, это не единственный способ получить ошибку, ты.

Ответ 6

У меня была эта проблема, и причина была довольно глупой. Я пробовал демонстрацию Microsoft относительно запуска ServiceHost с помощью исполняемого файла командной строки. Я следовал инструкциям, в том числе там, где говорится, чтобы добавить соответствующую услугу (и интерфейс). Но я получил вышеуказанную ошибку.

Оказывается, когда я добавлял класс службы, VS автоматически добавлял конфигурацию в app.config. И демо также пыталось добавить эту информацию. Поскольку он уже был в конфиге, я удалил демонстрационную часть, и она сработала.