Ошибка запуска службы 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.
Ответ 2
В .Net 4 вы можете использовать опцию multipleSiteBindingsEnabled
:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
</system.serviceModel>
Затем вам не нужно указывать каждый адрес.
http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx
Ответ 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. И демо также пыталось добавить эту информацию. Поскольку он уже был в конфиге, я удалил демонстрационную часть, и она сработала.