Как заставить конечную точку mex net.tcp (mexTcpBinding) участвовать в совместном использовании портов?

У меня есть служба WCF, которая размещена как служба Windows. Мы хотели бы включить конечную точку MEX по тому же адресу (но с суффиксом '/mex'). Я пытался сделать это (безуспешно), используя следующую конфигурацию:

<system.serviceModel>

  <services>
    <service
      name="MyCompany.MyService"
      behaviorConfiguration="defaultServiceBehavior">

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

      <endpoint
        address="MyService"
        binding="netTcpBinding"
        contract="MyCompany.IMyService"
        bindingConfiguration="netTcpBindingConfig"
        />

      <endpoint
        address="MyService/mex"
        binding="mexTcpBinding"
        contract="IMetadataExchange"
        />

    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="defaultServiceBehavior">
        <serviceMetadata />
      </behavior>
    </serviceBehaviors>
  </behaviors>

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

</system.serviceModel>

Когда он запускается, узел службы выдает AddressAlreadyInUseException с жалобой на то, что «на конечной точке IP 0.0.0.0:808 уже есть прослушиватель». На самом деле это имеет смысл для меня, потому что служба совместного использования портов открыла этот порт, чтобы обслуживать конечную точку MyService вместе с любыми другими службами, запрашивающими совместное использование этого порта на этой машине.

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

<endpoint
  address="net.tcp://localhost:818/MyService/mex"
  binding="mexTcpBinding"
  contract="IMetadataExchange"
  />

Это означает, что конечная точка mex теперь имеет свой собственный эксклюзивный порт. Недостатком этого является то, что любой другой службе, которая хочет предоставить конечную точку MEX, также потребуется уникальный порт для своей конечной точки MEX. Это делает его очень непредсказуемым при поиске конечных точек MEX.

Есть ли способ заставить конечную точку MEX участвовать в совместном использовании портов?


person Damian Powell    schedule 12.11.2010    source источник
comment
Просто мысль: добавить bindingConfiguration=netTcpBindingConfig в конечную точку MEX?   -  person Torben Koch Pløen    schedule 12.11.2010
comment
@Torben Да, я пробовал. Когда я это делаю, у конечной точки mex нет проблем с совместным использованием, но она совершенно не может создавать какие-либо метаданные.   -  person Damian Powell    schedule 12.11.2010


Ответы (1)


Два варианта:

  1. Простой способ: измените всю привязку точки mex на netTcpBinding и повторно используйте вашу привязкуConfiguration. mexTCPBinding предназначен только для удобства и является необязательным. Если он не работает для вас, не используйте его.

  2. Сложный способ: вы можете изменить mexTCPBinding, чтобы разрешить совместное использование. Единственный пример, который я видел, находится в коде здесь: http://blogs.msdn.com/b/drnick/archive/2006/08/23/713297.aspx

person ErnieL    schedule 15.11.2010
comment
Спасибо за ответ. Я попытался изменить mexTcpBinding на netTcpBinding, но не в кости. Когда я это делаю, служба запускается и не жалуется на проблемы с общим доступом (что круто), но совершенно не отвечает на запросы mex (что не круто). Предположительно есть что-то еще, что мне нужно настроить, если я использую netTcpBinding, о котором я не знаю? - person Damian Powell; 15.11.2010
comment
@ Дамиан, ты когда-нибудь решал эту проблему? Как ни странно, мы наблюдаем эту проблему на моем локальном компьютере, но не в рабочей среде. - person James Crowley; 08.03.2012