Помилка запуску служби WCF "Ця колекція вже містить адресу зі схемою http"


182

Я створив веб-додаток, що містить договір на обслуговування WCF та контроль Silverlight, який здійснює дзвінки до цієї служби WCF. На моїх розробниках і тестових серверах це чудово працює.

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

Ця колекція вже містить адресу зі схемою http. У цій колекції може бути не більше однієї адреси на схему.

Я читав, що цей виняток може бути викинутий, якщо веб-сайт має більше одного хост-заголовка, що вірно на нашому реальному сервері. Мабуть, послуги WCF, розміщені в IIS, можуть мати лише одну базову адресу. Як я можу обійти це питання?

Відповіді:


167

У .Net 4 ви можете скористатися multipleSiteBindingsEnabledпараметром:

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

Тоді вам не доведеться вказувати кожну адресу.

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


Так, але це працює лише з .NET 4.0 і вище. Не вдається використовувати це на сайтах .NET 2.0 / 3.0 / 3.5.
Bytemaster

2
Примітка - тут є друкарська помилка - закриття немає>, тому якщо скопіювати та вставити, ви матимете проблеми
sydneyos

2
Це питання не спрацює: "Цей функціонал доступний лише за допомогою протоколу HTTP."
Джордж Ціокос

146

Підсумок,

Рішення коду: Ось

Рішення конфігурації: Ось

За допомогою Майка Шалія я знайшов кілька рішень, як це зробити за допомогою коду. Оскільки ця проблема стосуватиметься майже всіх проектів, які ми розгортаємо в прямому середовищі, я витримав рішення, що має суто конфігурацію. Зрештою, я знайшов таку інформацію, як це зробити в .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.


2
Додавання фільтра базової адреси до web.config працювало чудово. Спасибі Джеремі!
Mike737

2
Я не можу придумати жодної причини, чому б хотілося такого обмеження, тим більше за замовчуванням ...
pbz

42
Я починаю погано думати про WCF у поєднанні з ASP.net та веб-сервісами, доступ до яких здійснюється через JavaScript. У мене було набагато менше проблем із звичайними старими послугами ASMX ...
Юрі,

Ну що робити, якщо у вас є веб-сайт із сумішшю програм .net 4 та .net 2, що працюють під ним. Основою програми є .net4, а під нею є кілька додатків, для яких потрібна .net2. Чи використовуєте ви <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> у всіх .net4-файлах та префіксі в додатках .net 2?
Тревіс

59

Ви бачили це - 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> 

Дякую. Я продовжуватиму пошук, щоб побачити, чи є рішення, що не має коду. Що можна зробити в конфігурації, тому що це вплине на будь-який проект, який ми робимо, я сподіваюся не потрібно писати спеціальний код.
Джеремі

16

У моєму випадку першопричиною цієї проблеми було кілька прив'язок http, визначених на батьківському веб-сайті, тобто InetMgr-> Sites-> Mysite-> Properties-> EditBindings. Я видалив одну прив'язку http, яка не потрібна, і проблему було вирішено.


1
Так, Амар це було дуже корисно - в моєму випадку це порушило ІНШИЙ веб-сайт із численними прив’язками. Доступно зовні на одній машині (але з іншим ім'ям хоста). Так само це можна виправити, додавши налаштування multipleSiteBindingsEnabled, але тоді web.config відрізнятиметься від усіх інших середовищ.
Кодер

2
Соромно, що це внизу. У нашому випадку це зафіксувало це для нас.
brendonparker

Це допомогло мені повторити помилку в середовищі розробки. Я не можу редагувати прив’язки веб-сайтів ні в умовах сертифікації, ні в прямому ефірі. Я змінив файл хостів, щоб імітувати домен, і додав прив'язки до локальних IIS та bam!
MFedatto

8

І в моєму випадку це було просто: я використав майстра "Додати службу WCF" у Visual Studio, який автоматично створив відповідні розділи в app.config. Потім я продовжив читати, як: розмістити службу WCF в керованій програмі . Проблема полягала в тому, що мені не потрібно було вказувати URL для запуску веб-служби.

Замінити:

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

З:

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

І помилки вже немає.

Загальна ідея: якщо ви вказали базову адресу як парам і вказали її в config, ви отримаєте цю помилку. Найімовірніше, це не єдиний спосіб отримати помилку, ти.


Вирішив мою проблему.
QShengyao

2

У мене була ця проблема, і причина була досить дурною. Я випробовував демонстрацію Microsoft щодо запуску ServiceHost з w / у командному рядку, що виконується. Я дотримувався вказівок, включаючи те, де написано, щоб додати відповідний Сервіс (та інтерфейс). Але я отримав вищезгадану помилку.

Виявляється, коли я додав клас обслуговування, VS автоматично додав конфігурацію до app.config. І демонстратор намагався також додати цю інформацію. Оскільки це вже було в конфігурації, я видалив демонстраційну частину, і вона спрацювала.


0

Я стався з тієї ж помилки на старому сервері Exchange 2010. Сервіс (служба реплікації поштової скриньки) видав вищевказану помилку, і процес міграції не міг продовжуватися. Шукаючи через Інтернет, я зайшов за цим посиланням, у якому зазначено нижче:

Сервер Exchange GRE не відкриється при першому встановленні або внесення будь-яких змін на сервер IIS. Це не вдається з помилкою оснащення, і при спробі відкрити оснащену сторінку відображається такий вміст:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Причина : Ця помилка виникає через те, що номер порта 444 вже використовується іншою програмою, а сервер IIS не налаштований для обробки декількох прив'язок до одного порту.

Рішення : Налаштувати сервер IIS для обробки декількох прив’язок портів. Зверніться до продавця (Microsoft), щоб налаштувати його.

Оскільки ці послуги пропонувались із веб-сервера IIS, перевірка Прив'язки на Root Site виправила проблему. Хтось переплутав прив’язки до сайту, визначивши правила, які перетинаються між собою та переплутали служби.

Виправлення правильних Прив'язок вирішило проблему, в моєму випадку, і мені не довелося конфігурувати Web.Config.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.