Проблема общего доступа к сервисному порту WCF - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь разместить несколько служб WCF REST на одном и том же порту.Я запустил Net.Tcp Port Sharing Service, и это мой файл app.config:

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>    
    <services>  
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/services/"/>
          </baseAddresses>
        </host>

        <endpoint
          address="test"
          binding="webHttpBinding"
          contract="IMyService"/>
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <netTcpBinding>
        <binding name="PortSharingEnabled" portSharingEnabled="true">
        </binding>
      </netTcpBinding>
    </bindings>

  </system.serviceModel>

</configuration>

Я все еще не могу разместить две службы на одном и том же порту.

Когда я пытаюсь запустить вторую службу, я получаю следующую ошибку: http://screencast.com/t/Vlakb26XbuQr. "Служба службы на локальном компьютере запускается, а затем останавливается. Некоторые службы останавливаются автоматически, если они не работают.используется другими службами или программами ".

Журнал трассировки (http://screencast.com/t/tJ5Gvmy4Dgm7) говорит: " HTTP не удалось зарегистрировать URL http://+:7778/MyServiceName/. Другое приложение уже зарегистрировало этоURL с HTTP.SYS . "

РЕДАКТИРОВАТЬ:

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="first"
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="second"
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>

Я полагаю, что-то не хватает для включения общего доступа к портам?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

То, что вы пытаетесь сделать, не имеет смысла. «Совместное использование портов» может происходить двумя способами:

  • Http: это работает (вроде) из коробки в Windows, так как HTTP обрабатывается драйвером уровня ядра HTTP.SYS. Ничего особенного вам не нужно делать.

  • Net.Tcp Port Sharing. Это требует шагов, обозначенных здесь .

Однако ваша (единственная) конечная точка настроена на использование HTTP-привязки, а не Net.Tcp-Binding (что, в свою очередь, имеет смысл, если вы хотите использовать службу в стиле REST), поэтому общий доступ к портам Net.Tcp здесь не применимо.

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

EDIT

Все еще сбивает с толку. С вашего app.config выглядит так, как будто вы используете порт 80 для своих конечных точек, однако в сообщении об ошибке, которое вы цитируете, указано, что порт 8080. Как бы то ни было, в любом случае применимо следующее.

Из предоставленных вами сообщений об ошибках выглядит, как будто вы пытаетесь дважды зарегистрировать / запустить службу с одинаковым URI конечной точки. Это не будет работать. Вы можете повторно использовать часть hostname:port или даже части пути, но полный URI должен быть уникальным.

Например, вы можете использовать следующие URI конечной точки:

Обратите внимание, что это то же самое для общего доступа к порту Net.Tcp - вы можете использовать порт , но не полный (уникальный) URI конечной точки. Отсюда и название "порт" общего доступа. Это не прозрачный механизм балансировки нагрузки или что-то подобное.

0 голосов
/ 25 января 2012

Несмотря на то, что есть принятый ответ, я просто добавлю его, что у меня была похожая проблема при программном определении сервисов. Я создаю сервис следующим образом:

_serviceHost = new ServiceHost(_cmdService, new Uri(_serviceAddress));

ServiceEndpoint endPoint =
    _serviceHost.AddServiceEndpoint(typeof(IHttpCmdService), _binding, _endpointAddress);
endPoint.Behaviors.Add(new WebHttpBehavior());

Удивительно, но когда я пытаюсь сделать это несколько раз с одним и тем же _serviceAddress и разными значениями _endpointAddress, происходит сбой. Но если я помещу весь адрес в _serviceAddress, это будет успешно. Оба метода имеют один и тот же конечный URL-адрес службы.

Итак, зная об этом, мне интересно, если вы создадите свои сервисы с другими значениями baseAddress, будет ли он успешно запущен, так это будет выглядеть так:

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/first/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/second/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>
...