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