2012-04-12 3 views
6

Я работаю с двумя приложениями, у меня есть служба самообслуживания, настроенная на использование привязки 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. Я собираюсь бросить и изменить код, чтобы каждый поток имел свой собственный канал, надеясь, что это исправляет проблему, но я хочу знать, почему это происходит. Если кто-то знает, что я делаю неправильно, или могу указать мне в правильном направлении, чтобы продолжить расследование, это будет полезно.

+0

Каковы порты обоих приложений? Вы пробовали [запустить трассировку] (http://stackoverflow.com/a/9897291/151445) или отметили резервирование портов? Вы также можете запустить [tcpview] (http://technet.microsoft.com/en-us/sysinternals/bb897437) и отслеживать соединения tcp обоих приложений. –

+0

Порт, используемый для обоих приложений, - это порт net.tcp по умолчанию, 808. Я попробую приложение tcpview для мониторинга соединений, спасибо! – Diego

+0

По умолчанию Windows не разрешает совместное использование портов. Я бы проверял, что вы правильно включили его ([см. Здесь] (http://msdn.microsoft.com/en-us/library/ms734772.aspx)). Если возможно, вы также можете попробовать изменить порт одного приложения или выполнить тестирование одного в виртуальной машине. –

ответ

1

По умолчанию Windows не разрешает совместное использование портов. Я бы проверял, что вы правильно включили его (see here).

Если возможно, вы также можете попробовать изменить порт одного приложения или выполнить тестирование одного в виртуальной машине.

Кроме того, для всех, у кого может быть такая же проблема, выполните, как это сделал Диего, и проверьте, разрешено ли использование портов в конфигурации.Добавить portSharingEnabled="true" к связыванию:

<system.serviceModel> 
    <bindings> 
    <netTcpBinding name="portSharingBinding" 
        portSharingEnabled="true" /> 
    <services> 
    <service name="MyService"> 
     <endpoint address="net.tcp://localhost/MyService" 
        binding="netTcpBinding" 
        contract="IMyService" 
        bindingConfiguration="portSharingBinding" /> 
    </service> 
    </services> 
</system.serviceModel> 

Взято из: http://msdn.microsoft.com/en-us/library/ms731810.aspx

Смежные вопросы