Почему TimeoutException не нарушает работу моего канала?

У меня есть дуплексный сервис WCF и клиент, работающий на одной машине. Клиент настроен на 15 секунд:

<binding name="NetTcpBinding_IServiceIPC" closeTimeout="00:00:15"
      openTimeout="00:00:15" receiveTimeout="00:00:15" sendTimeout="00:00:15" />

Клиент обрабатывает ошибки следующим образом:

client.InnerChannel.Faulted += FaultHandler;
client.InnerDuplexChannel.Faulted += FaultHandler;
client.ChannelFactory.Faulted += FaultHandler;

Если я завершу процесс обслуживания, клиент правильно получит TimeoutException через 15 секунд:

This request operation sent to net.tcp://localhost:8732/Service/ did not receive a reply within the configured timeout (00:00:15).  The time allotted to this operation may have been a portion of a longer timeout.  This may be because the service is still processing the operation or because the service was unable to send a reply message.  Please consider increasing the operation timeout (by casting the channel/proxy to IContextChannel and setting the OperationTimeout property) and ensure that the service is able to connect to the client. (System.TimeoutException)

Тем не менее, канал не неисправен в этой точке. Мой обработчик ошибок не вызывается примерно через 5 минут после того, как я завершу процесс обслуживания. Я думал, что TimeoutException будет неисправен канал (см. этот ответ), но почему-то это не так. Можно ли каким-то образом заставить канал быстрее выйти из строя после завершения процесса обслуживания?

1 ответ

Решение

Этот вопрос Неисправность дуплексного канала не возникает при второй попытке подключения. Faulted событие не всегда происходит И диаграмма состояний WCF на MSDN подтверждает эту возможность - http://msdn.microsoft.com/en-us/library/ms789041.aspx

Есть много путей к закрытому состоянию, которые не проходят через неисправное состояние. Скорее всего, когда вы выходите, Abort() вызывается метод, и вы переходите из открытого состояния в закрытое состояние, не проходя через ошибочное состояние. Добавьте запись в журнал, чтобы проверить состояние во время выполнения. Если вы пытаетесь снова открыть канал после истечения времени ожидания, это объяснит, почему вы оказались в неисправном состоянии через 5 минут. Чтобы решить ваши большие проблемы, переместите логику в FaultedHandler в другом месте, поэтому он выполняется, когда вы достигаете закрытого состояния через другие пути.

Я знаю, что вопрос старый. Но я довольно много искал и всегда попадал сюда. Я решил опубликовать свои выводы здесь:

Это зависит от того, какой тайм-аут.

Если вы нажмете SendTimeout или ReceiveTimeout вашей привязки (в моем случае NetTcpBinding), тогда да, канал будет неисправен.

НО, если вы нажмете OperationTimeout вашего Сервиса (в моем случае DuplexChannel), то вы просто получите TimeoutExceptionи канал НЕ будет неисправен.

Другие вопросы по тегам