Вызов WCF завершился неудачно, потому что основное соединение было закрыто - PullRequest
1 голос
/ 27 ноября 2009

Я звоню в службу WCF, но получаю CommunicationException на клиенте при получении ответа от службы.

System.ServiceModel.CommunicationException: Произошла ошибка при получении ответа HTTP на http://localhost:8080/Service. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Смотрите журналы сервера для более подробной информации. ---> System.Net.WebException: базовое соединение было закрыто: при получении произошла непредвиденная ошибка. ---> System.IO.IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. ---> System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом

  • Клиент, который выполняет вызов, является прокси-клиентом WCF.
  • Сервисный метод выполняется без любые исключения.
  • Вызов WCF работает нормально в тех случаях, когда он не занять много времени для службы способ закончить.
  • Вызов WCF завершается неудачно с приведенным выше сообщением об исключительной ситуации, когда для метода службы требуется много времени.

Свойство sendTimeout привязки клиента было увеличено до 30 минут, чтобы учесть время, необходимое для завершения метода обслуживания.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2009

Очень длинная операция, подобная этой, скорее всего, должна вызываться асинхронно - другими словами, клиент просит сервер подготовить данные, а затем продолжает что-то еще, пока сервер выполняет свою работу. Когда сервер закончил, он перезванивает клиенту.

Асинхронные операции WCF обсуждаются здесь .

2 голосов
/ 27 ноября 2009

Попробуйте установить receiveTimeout равным или большим, чем время, необходимое для завершения метода обслуживания. Значение по умолчанию для свойства receiveTimeout составляет 10 минут. Таким образом, если метод обслуживания занимает больше времени, соединение будет закрыто (если никакие другие действия не выполняются до того, как произойдет receiveTimeout). Свойство receiveTimeout описано здесь .

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