У меня есть служба 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. {n--; вернуть n ^ (n >> 1); } Может кто-нибудь объяснить, как ...
формула для вычисления n-го кода серого выглядит так:
(n-1) XOR (floor((n-1)/2))
(Source: wikipedia)
Я закодировал ее как:
int gray(int n)
{
n--;
return n ^ (n >> 1);
}
Может кто-нибудь объяснить, как работает приведенная выше формула, или, возможно, ее вывод?