Состояние канала WCF Не обновляется - PullRequest
2 голосов
/ 17 ноября 2011

У меня проблема с моим приложением WCF.Я использую netTcpBinding для моего приложения.А на стороне клиента я использую ClientBase <> для подключения к хосту и ICommunicationObject.State для проверки, доступен ли канал.

Проблема в том, что после «receiveTimeout» соединение TCP обрывается, но на стороне клиента, когда я проверяю состояние, оно все еще "Открыто".И когда я пытаюсь использовать его напрямую, возникают исключения.

Чтобы подтвердить отключение сокета TCP, я использую TCPView для его мониторинга.Он отключается после тайм-аута.Но состояние канала не обновляется.


Точно, я добавляю диагностический журнал в конфиг сервера.И я получаю исключение сразу после истечения времени ожидания (в то же время происходит отключение).

Вот исключение (на стороне сервера):

System.ServiceModel.CommunicationObjectAbortedException, System.ServiceModel, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 System.Net.Sockets.SocketException, система, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 Ошибка TCP (995: операция ввода-вывода имеетбыл прерван из-за выхода из потока или из-за запроса приложения) при передаче данных.

И если я пытаюсь снова вызвать службу из клиента, на стороне клиента я получаю это исключение:

System.ServiceModel.CommunicationException: соединение с сокетом было прервано.Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса.

Я думаю, что это нормально для исключения на стороне клиента.Но я не знаю, нужно ли мне обрабатывать исключения на стороне сервера.

У кого-то есть идея?

Спасибо всем большое.

1 Ответ

2 голосов
/ 17 ноября 2011

CommunicationState будет оставаться «Открытым», если вы явно не Close() или если это не ошибка в канале.К сожалению, в вашем сценарии до тех пор, пока вы не попытаетесь использовать указанный канал, невозможно определить, действительно ли он доступен, кроме проверки на исключение.

Я бы посоветовал вам не пытаться сохранитьКанал, открытый после точки его использования и явно Close(), как только вы закончите.

У нас есть обертка, которая инкапсулирует вызов, включая создание прокси, сам вызов службы и последующиезакрытие канала, и это хорошо работает.

...