Ошибка запуска службы WCF "Эта коллекция уже содержит адрес со схемой http" - PullRequest
178 голосов
/ 18 февраля 2009

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

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

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

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

Ответы [ 6 ]

161 голосов
/ 08 июля 2010

В .Net 4 вы можете использовать опцию multipleSiteBindingsEnabled:

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

Тогда вам не нужно будет указывать каждый адрес.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

145 голосов
/ 18 февраля 2009

Краткое описание

Кодовое решение: Здесь

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

С помощью Mike Chaliy я нашел несколько решений о том, как сделать это с помощью кода. Поскольку эта проблема затронет в значительной степени все проекты, которые мы развертываем в реальной среде, я придерживался чисто конфигурационного решения. В конце концов я нашел один, который подробно описывает, как это сделать в .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 не поддерживать любые символы подстановки.

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

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

55 голосов
/ 18 февраля 2009

Вы видели это - 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> 
15 голосов
/ 27 мая 2013

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

6 голосов
/ 25 ноября 2015

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

Заменить:

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

С:

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

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

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

2 голосов
/ 10 января 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...