Как заставить конечную точку net.tcp mex (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 участвовать в совместном использовании портов?

Ответ 1

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

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

  • Трудный способ: вы можете изменить mexTCPBinding, чтобы включить общий доступ. Единственный пример, который я видел в коде: http://blogs.msdn.com/b/drnick/archive/2006/08/23/713297.aspx