Внутреннее сообщение об исключении 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" 
        /> 

Просто попробуйте удалить одну из

Другие вопросы по тегам