Как заставить конечную точку mex net.tcp (mexTcpBinding) участвовать в совместном использовании порта? - PullRequest
11 голосов
/ 12 ноября 2010

У меня есть служба 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 участвовать в совместном использовании порта?

1 Ответ

8 голосов
/ 15 ноября 2010

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

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

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

...