обратный вызов недействителен в сервисе wcf - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть клиент форм win, который обращается к службе wcf для длительной работы. Сервис предоставляет методы подписки и отмены подписки. Когда клиент вызывает метод подписки, сервис генерирует для него новый guid и получает текущий контекст обратного вызова, сохраняет этот контекст guid и обратного вызова в словаре клиента и возвращает Guid. По запросу пользователя клиентская служба звонков с этим гидом запускает длительную операцию. Как только служба завершает операцию, она возвращает клиенту обратный вызов. Затем клиент получает обработанные данные из службы.

Иногда я получаю ошибку при выполнении обратного вызова

Операция «OnServiceCallback» не может быть завершена, так как тайм-аут сеансового канала истек в ожидании получения сообщения. Чтобы увеличить время ожидания, либо установите свойство receiveTimeout для привязки в файле конфигурации, либо установите свойство ReceiveTimeout для привязки напрямую.

Часть, которую я не могу понять, состоит в том, что это происходит очень непоследовательно. В большинстве случаев это происходит после того, как клиент и служба некоторое время работали.

Я новичок в службе wcf и приветствую любые предложения по устранению этой ошибки.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2010

Я смог найти ответ на ошибку, выполнив несколько старых добрых проб и ошибок. Обратный вызов не удался, потому что объект OperationContext.Current, который я пытался использовать, был нулевым. Это было потому, что я пытался получить доступ к объекту OperationContext.Current в потоке, который отличался от потока службы. Итак, чтобы решить, что я сейчас обращаюсь к объекту OperationContext.Current в служебном потоке, а затем передаю callbackContext в качестве параметра во внешнюю логику обработки, которая фактически должна его использовать.

0 голосов
/ 21 сентября 2010

Привязка имеет свойство под названием receiveTimeout. Это свойство по умолчанию установлено на 10 минут. Он определяет, как долго экземпляр службы ожидает следующего запроса, прежде чем он будет завершен. Таким образом, если в течение 10 минут между клиентом и службой не будет активности, экземпляр службы будет закрыт, и клиент больше не сможет его использовать В дуплексном обслуживании это может быть еще более сложным, потому что есть услуги с обеих сторон. Возможно, вам потребуется настроить receiveTimeout на обоих концах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...