Я столкнулся с этой проблемой после установки .Net 4.5 и выкладываю здесь решение, чтобы помочь другим, если они столкнутся с ним. Ответ @ berkayk, приведенный выше, сработал (выставив mex на другой порт), но мне нужно было выставить обе конечные точки через один порт.
Предположим, у вас есть две конечные точки, одна из которых использует netTcpBinding, а другая - mexTcpBinding.
При использовании привязок по умолчанию некоторые значения по умолчанию рассчитываются с использованием OSEnvironmentHelper.ProcessorCount вместо жестко заданных значений, как это было в .Net 4.0.
В моем случае, при использовании именованного netTcpBinding bindingConfiguration значение, предоставленное для свойства MaxConnections, было равно 20. Установка свойства MaxConnections в NetTcpBinding также устанавливает его свойство TcpTransportBindingElement MaxPendingConnections и свойство ConnectionPoolSettings.MaxPettingSecount.
Если не использовать именованную netTcpBinding bindingConfiguration и использовать только значение по умолчанию, свойство MaxPendingConnections рассчитывалось с использованием следующего алгоритма:
return (12 * OSEnvironmentHelper.ProcessorCount);
Транспорт mexTcpBinding также вычислил его свойство MaxPendingConnections с использованием вышеуказанного алгоритма, поэтому, когда ни один из них не использует именованную bindingConfiguration, значения по умолчанию совпадают, и проблемы не возникает.
При использовании именованного netTcpBinding bindingConfiguration, MaxPendingConnections транспорта было 20, а MaxPendingConnections транспорта mexTcpBinding на моем компьютере равнялся 96. Разница в значениях для MaxPendingConnections между этими двумя конечными точками, совместно использующими один и тот же порт, несовместима.
Я также обнаружил, что эта проблема возникла и с набором ListenBacklog.
(Я не знаю всех возможных конфликтующих значений, которые могут существовать.)
Чтобы решить эту проблему, вы можете создать настраиваемую привязку для mex, которая соответствует названной bindingConfiguration для netTcpBinding. Пример ниже:
<endpoint binding="netTcpBinding" bindingConfiguration="TestNetTcpBinding"
contract="YourContract" />
<endpoint address="mex" binding="customBinding" bindingConfiguration="TestMexBinding"
contract="IMetadataExchange" />
<bindings>
<customBinding>
<binding name="TestMexBinding">
<tcpTransport maxPendingConnections="20" listenBacklog="20">
<connectionPoolSettings groupName="default" maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
</binding>
</customBinding>
<netTcpBinding>
<binding name="TestNetTcpBinding" listenBacklog="20" maxConnections="20"/>
</netTcpBinding>
</bindings>
Или вы не можете указать какие-либо рассчитанные значения (например, maxConnections и listenBacklog) и принять значения по умолчанию (обратите внимание, что MaxOutboundConnectionsPerEndpoint по-прежнему сохранит значение по умолчанию, равное 10, поскольку оно не рассчитывается так же, как свойство MaxPendingConnections. ):
<binding name="TestNetTcpBinding" ...someOtherProperties except listenBacklog and maxConnections/>
Примечание: проблема описана здесь: http://msdn.microsoft.com/en-us/library/aa702636.aspx,, но единственное решение, которое дано, - это выставить mex на другом порту. Ниже приведены некоторые скриншоты в отражателе, которые показывают разницу между .net 4.0 и 4.5 при расчете значений по умолчанию MaxPendingConnections: