Размещение службы WCF в IIS 7 (WAS) с привязкой net.tcp на ДВУХ портах tcp - PullRequest
5 голосов
/ 13 сентября 2009

По умолчанию веб-сайт IIS 7 имеет привязку net.tcp со строкой информации о привязке «808: ». Если я добавлю еще одну привязку net.tcp с исключением «xxx: », произойдет:

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

Как я могу решить эту проблему и прослушать мой сервис на ДВУХ портах?

Ответы [ 3 ]

8 голосов
/ 13 сентября 2009

По сути, в вашей службе вы должны иметь возможность определять любое количество конечных точек службы на любом количестве портов.

Есть два способа сделать это:

  • определить базовый адрес и относительный адрес в конечной точке вашей службы
  • определяет полный адрес в каждой конечной точке

Если вы сделаете вариант № 1, у вас будет что-то вроде этого:

<service name="YourService">
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://YourServer:5151/Services" />
    </baseAddresses>
  </host>
  <endpoint name="endpoint1"
            address="Service1"
            binding="netTcpBinding"
            contract="IYourService" />
  <endpoint name="endpoint2"
            address="Service2"
            binding="netTcpBinding"
            contract="IYourService" />
</service>

Таким образом, в этом случае у вас есть две конечные точки службы для одного контракта, и они будут прослушивать URL-адреса

net.tcp://YourServer:5151/Services/Service1

и

net.tcp://YourServer:5151/Services/Service2

Вы можете иметь несколько конечных точек службы, но только один базовый адрес.

Другой вариант - не указывать базовые адреса и напрямую указывать полный адрес службы в конечной точке:

<service name="YourService">
  <endpoint name="endpoint1"
            address="net.tcp://YourServer:5151/Services/Service1"
            binding="netTcpBinding"
            contract="IYourService" />
  <endpoint name="endpoint2"
            address="net.tcp://YourServer:6868/Services/Service2"
            binding="netTcpBinding"
            contract="IYourService" />
</service>

В этом случае, поскольку вы определяете весь адрес в конечной точке, вы можете выбрать два разных порта TCP, по одному для каждой конечной точки. Это должно работать без проблем на всех. У вас есть две отдельные конечные точки на двух отдельных портах, которые слушают и обслуживаются одним и тем же классом обслуживания в фоновом режиме.

Марк

2 голосов
/ 13 июня 2010

На днях я пытался развернуть службу WCF на одном из моих веб-серверов и столкнулся с проблемой. Я продолжал получать следующее сообщение об ошибке: p>

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

Проблема не возникла на моей локальной машине, но возникла на веб-сервере, что немного затрудняло выяснение причины ее возникновения. Это произошло на сервере, потому что мой веб-сервер находится в среде общего хостинга, и в этом случае службе WCF также необходимо знать заголовок узла. Для этого я перешел в web.config и добавил следующее:

<serviceHostingEnvironment>
<baseAddressPrefixFilters>    
    <add prefix=http://MyHostHeader />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
0 голосов
/ 14 сентября 2009

Это снова я.

Это работает с собственным хостом

 <baseAddresses>
            <add baseAddress="net.tcp://localhost" />
            <add baseAddress="net.tcp://localhost:12345" />
 </baseAddresses>

но с IIS7 + БЫЛО исключение

Не удалось подключиться к net.tcp: // localhost: 12345 / game2.svc. Попытка подключения продолжалась в течение промежутка времени 00: 00: 02.0936160. Код ошибки TCP 10061: Соединение не может быть установлено, потому что целевая машина активно отказалась от него

Вопрос был о среде размещения IIS

...