Свойство 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>
Ответы
Ответ 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 может быть одинаковым!