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