Я пытаюсь добиться следующего - один экземпляр прокси на стороне клиента (остается открытым), доступ к которому осуществляется несколькими потоками с использованием надежного сеанса . До сих пор мне удавалось иметь либо А) надежный сеанс с прокси на стороне клиента, который создается и удаляется для вызова, либо Б) то, к чему я стремлюсь, но без надежного сеанса.
Однако, когда я включаю надежные сеансы в моей привязке, проявляется следующее поведение:
на стороне клиента
При запуске приложения все работает нормально до примерно 18 сообщений в сеансе WCF. Сначала я получаю событие proxy.InnerChannel.Faulted
, затем происходит исключение в точке, где я вызываю метод на прокси. Исключением является System.TimeoutException
с сообщением:
"Время ожидания канала запроса при ожидании ответа после
00: 00: 59,9062512. Увеличьте значение тайм-аута, переданное вызову
Запрос или увеличение значения SendTimeout в привязке. Время
выделенный на эту операцию, возможно, был частью более длительного
Тайм-аут ".
Внутреннее исключение имеет похожее сообщение:
"Операция запроса не завершена в течение выделенного времени ожидания
00:01:00. Время, отведенное для этой операции, могло быть частью
более длительного тайм-аута. "
При методе в верхней части трассировки внутреннего стека:
System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout)
Затем я вызываю proxy.Close
, за которым следует proxy.Abort
(перехват и игнорирование исключений). Если я использую настройки по умолчанию (т. Е. Просто <reliableSession/>
), то вызываю прокси. Закрытие приводит к другому исключению System.Timeout
(хотя на этот раз назначенное время ожидания равно 00:00:00), однако, если я переопределяю значения по умолчанию, как указано выше, исключение не выдается.
Служащие сторона
Используя трассировку WCF, я получаю System.ServiceModel.CommunicationException
с сообщением:
"Последовательность была прервана удаленной конечной точкой. Сеанс
перестал ждать конкретного ответа. Из-за этого
надежный сеанс не может продолжаться Надежный сеанс был сорван. "
И трассировка стека, заканчивающаяся в:
System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
При удаленном подключении к серверу я получаю то же сообщение, которое возникает, когда выполнение кода переходит к оператору возврата моего сервиса при вызове службы, что вызывает ошибку.
Меня озадачивает то, что служба стабильна и работает с вариантами A) или B), как описано в начале моего сообщения, и происходит после разного количества сообщений (около 18). Первый факт указывает на то, что в коде нет ничего плохого (на самом деле я проверил, что не генерируются никакие исключения), а второй просто сбивает меня с толку, и именно поэтому я изменил настройки надежной привязки сессии.
Я застрял на этом. Кто-нибудь может подсказать, почему такой надежный сеанс будет таким же?