Внутреннее сообщение об исключении WCF "Регистрация URI" net.tcp://.... "уже существует" при попытке поддержки двойной локальной сети из службы WCF
У меня есть собственная служба WCF, которая использует протокол net.tcp для конечной точки, и она отлично работает на ПК с обычной сетевой картой.
Тем не менее, я хочу поддерживать ПК с двумя сетевыми картами, и это вызывает у меня проблемы. Я назначил разные IP-адреса двум картам (192.168.1.1 и 193.168.1.1). Затем я изменил свой файл app.config, чтобы попытаться поддержать двойную локальную сеть, добавив вторую конечную точку для службы WCF, используя второй IP-адрес. (Мой клиент WCF может обрабатывать выбор одного из двух адресов конечных точек).
Когда я запускаю сервис, я получаю следующее сообщение об ошибке:
ChannelDispatcher по адресу "net.tcp://193.168.1.1:59301/MyClientService" с контрактом (-ами) "IMyClientService" не может открыть свой IChannelListener.
Дополнительная информация из внутреннего исключения: уже существует регистрация для URI "net.tcp://193.168.1.1:59301/MyClientService".
Примечание. Если я изменю номер порта на второй конечной точке в файле app.config (например, если я использую 193.168.1.1:59302), служба запустится нормально. Это обходной путь, но было бы полезно иметь возможность использовать один и тот же порт для обеих локальных сетей, если это возможно.
О, и я попробовал portSharingEnabled на привязке (с запущенной службой общего доступа к портам Net.TCP), но это не помогло.
Заранее спасибо...
Мой файл app.config выглядит так:
<!-- Information about assembly binding and garbage collection -->
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
<system.serviceModel>
<services>
<service name ="MyNamespace.MyClientService" behaviorConfiguration="MyServiceBehavior">
<host>
<baseAddresses>
<!-- Using TCP -->
<add baseAddress = "net.tcp://localhost:59301/MyClientService/" />
</baseAddresses>
</host>
<!-- Using TCP -->
<endpoint
address="net.tcp://192.168.1.1:59301/MyClientService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IMyClientService"
contract="MyNamespace.IMyClientService"
/>
<endpoint
address="net.tcp://193.168.1.1:59301/MyClientService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IMyClientService"
contract="MyNamespace.IMyClientService"
/>
<!-- Metadata Endpoints -->
<!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
<!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
<endpoint
address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<bindings>
<!-- ==================================================================================== -->
<!-- TCP/IP bindings -->
<netTcpBinding>
<binding name="NetTcpBinding_IMyClientService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="2147483647" maxConnections="10"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<!-- <serviceMetadata httpGetEnabled="True"/> -->
<serviceMetadata/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
2 ответа
Что решает "localhost"?
Похоже, вы добавляете базовый адрес для "localhost" и две дополнительные конечные точки, одна из которых, вероятно, будет конфликтовать с localhost.
Попробуйте удалить базовый адрес, посмотрите, если это имеет значение...
Похоже, что следующий раздел дублируется:
<endpoint
address="net.tcp://192.168.1.1:59301/MyClientService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IMyClientService"
contract="MyNamespace.IMyClientService"
/>
Просто попробуйте удалить одну из