Проблема с общим портом службы WCF

Я пытаюсь разместить несколько служб WCF REST на одном порту. Я запустил службу общего доступа к портам Net.Tcp, и это мой файл 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>

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


person Nebojsa Veron    schedule 26.08.2011    source источник


Ответы (2)


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

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

  • Совместное использование портов Net.Tcp. Для этого требуются шаги, описанные здесь.

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

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

ИЗМЕНИТЬ

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

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

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

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

person Christian.K    schedule 26.08.2011
comment
После того, как я попытаюсь запустить вторую службу на том же порту, я получаю следующее окно с ошибкой: screencast.com/t/Vlakb26XbuQr. И это исключение журнала трассировки: screencast.com/t/tJ5Gvmy4Dgm7. - person Nebojsa Veron; 26.08.2011
comment
Не могли бы вы добавить сообщения об ошибках в виде текста, желательно к вашему вопросу? Таким образом, те из нас, кто страдает от чрезмерной корпоративной фильтрации прокси, могут их увидеть. - person Christian.K; 26.08.2011
comment
Мой базовый адрес такой же, но адрес конечной точки - нет, посмотрите: screencast.com/t/HVd91WoThQU (редактировать в исходном сообщении). Как только я меняю порт второй службы на 7779, работает отлично. - person Nebojsa Veron; 29.08.2011
comment
Изображение на screencast.com/t/rutAOcQYvEZ (а) показывает что-то еще, кроме того, что показывает ваш вопрос , (b) очевидно, не является полным system.serviceModel разделом конфигурации (хотя я думаю, что это не имеет значения, в этом случае это плохой стиль) и (c) использует (снова) разные порты и имена служб, чем те, которые вы цитируете в своем вопрос. Очень сложно помочь с тем, что вещи все время меняются и не показываются полностью и последовательно. Я предлагаю вам предоставить полный (в лучшем случае автономный) пример, включая полную конфигурацию, сообщения об ошибках и т. Д. В вашем вопросе. - person Christian.K; 29.08.2011

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

_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>
person Gyuri    schedule 24.01.2012