Я работаю с двумя приложениями, у меня есть служба самообслуживания, настроенная на использование привязки net.tcp. ServiceBehaviorAttribute службы конфигурируется с:WCF: EndpointNotFoundException после запуска в течение нескольких секунд
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single,
IncludeExceptionDetailInFaults = true,
UseSynchronizationContext = false,
ValidateMustUnderstand = false)]
для обоих, обслуживание и клиента по transferMode установлен в потоковом режиме, и таймауты:
closeTimeout="00:01:00"
openTimeout="00:00:30"
receiveTimeout="00:02:30"
sendTimeout="00:02:30"
MaxConnections установлен в 500 и использует ServiceThrottlingBehavior значения WCF 4 по умолчанию:
- MaxConcurrentSessions: 100 * ProcessorCount
- MaxConcurrent Вызовы: 16 * ProcessorCount
- MaxConcurrentInstances: значение по умолчанию - это сумма из двух вышеперечисленных, которая соответствует той же схеме, что и раньше.
Я использую четырехъядерную машину, и служба обмена портами Net.Tcp включена.
Клиентское приложение имеет один канал для службы, созданной с использованием класса ChannelFactory. После создания канала генерируется 100 потоков. Каждый поток использует канал для отправки сообщений на сервер с частотой одного сообщения в секунду.
Через пару секунд работает нормально (клиент отправляет сообщения на сервер он получает их правильно) EndpointNotFoundException брошено со следующим сообщением:
Could not connect to net.tcp://localhost/service. The connection attempt lasted
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could
be made because the target machine actively refused it 127.0.0.1:808.
Странные вещи являются:
- Если я запускаю оба приложения на одной машине, временной интервал исключения составляет около 2 секунд, но если я запустил серверное приложение на своем компьютере и клиентское приложение на другой машине, временной интервал исключения всегда 1 секунда ,
- Несколько раз (например, каждый десятый) исключение не выбрасывается, и оба приложения работают нормально.
- Перед тем, как выбрано исключение, сервер получает сообщения и обрабатывает их правильно. На сервере не выбрасываются исключения.
Я провел много испытаний, уменьшив количество потоков, увеличив их, изменив закрытие, открытие, получение и отправку тайм-аутов на более низкие и более высокие значения, установив более высокое значение для maxConnections, но результат всегда равен То же самое, в какой-то момент вызывается исключение EndpointNotFoundException. Я собираюсь бросить и изменить код, чтобы каждый поток имел свой собственный канал, надеясь, что это исправляет проблему, но я хочу знать, почему это происходит. Если кто-то знает, что я делаю неправильно, или могу указать мне в правильном направлении, чтобы продолжить расследование, это будет полезно.
Каковы порты обоих приложений? Вы пробовали [запустить трассировку] (http://stackoverflow.com/a/9897291/151445) или отметили резервирование портов? Вы также можете запустить [tcpview] (http://technet.microsoft.com/en-us/sysinternals/bb897437) и отслеживать соединения tcp обоих приложений. –
Порт, используемый для обоих приложений, - это порт net.tcp по умолчанию, 808. Я попробую приложение tcpview для мониторинга соединений, спасибо! – Diego
По умолчанию Windows не разрешает совместное использование портов. Я бы проверял, что вы правильно включили его ([см. Здесь] (http://msdn.microsoft.com/en-us/library/ms734772.aspx)). Если возможно, вы также можете попробовать изменить порт одного приложения или выполнить тестирование одного в виртуальной машине. –