Подтвердить что ты не робот

Свойство WCF maxConnections

У меня есть служба WCF, написанная в .net 4, и выставляется через net.tcp. Каждый раз, когда я пытаюсь установить свойство MaxConnections конфигурации привязки на что-то большее, чем 10, я являюсь AddressAlreadyInUseException.

Почему это должно быть выбрано в настройке MaxConnection?

(если это имеет значение, я на сервере Server 2008 R2 Standard с 4-ядерным процессором и 4 ГБ оперативной памяти)

    <binding name="NetTcpBinding" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          transferMode="Buffered" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxBufferSize="25000000"
          maxReceivedMessageSize="25000000" maxConnections="50">
          <readerQuotas maxDepth="32" maxStringContentLength="25000000"
            maxArrayLength="25000000" maxBytesPerRead="25000000" maxNameTableCharCount="25000000" />
          <security mode="None" />
    </binding>

    <service behaviorConfiguration="ApiService.ServiceBehavior" name="Api.Service.PlatformApiService">
      <endpoint
        address="/Search"
        binding="netTcpBinding"
        bindingConfiguration="NetTcpBinding"
        contract="IApiService" />        
      <endpoint
        address="mex"
        binding="mexTcpBinding"
        bindingConfiguration="NetTcpBinding"
        contract="IMetadataExchange" />

      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:8094/Api/" />
        </baseAddresses>
      </host>
    </service>
4b9b3361

Ответ 1

Конечная точка mex определяет конфигурацию привязки, которая не является частью вашего фрагмента конфигурации.

MaxConnection определяет объединение соединений для данного порта. В настоящий момент вы используете две конечные точки, которые используют один порт - конечные точки ApiService и Metadata. Перед изменением настроек в вашей конфигурации привязки, как enpoints используется значение по умолчанию - 10 соединений в пуле. Когда вы изменили значение, которое повлияло только на одну конечную точку, вторая конечная точка все еще требует 10 соединений = > исключение. Решения:

  • Экспортировать конечную точку метаданных на другом порту.
  • Создать пользовательскую привязку для конечной точки Mex. По умолчанию mexTcpBinding не позволяет изменять MaxConnections. Задайте одно значение для MaxConnection в пользовательской привязке.
  • Попробуйте использовать обмен портами.

По крайней мере, первая идея должна работать.

Ответ 2

<endpoint
        address="mex"
        binding="netTcpBinding" 
        bindingConfiguration="NetTcpBinding"
        contract="IMetadataExchange" />

use binding = "netTcpBinding", а не mexTcpBinding, поэтому две конечные точки могут создать одну и ту же конфигурацию netTcpBinding. Значение maxConnections может быть одинаковым!