#c# #windows-services
#c# #windows-службы
Вопрос:
Я разрабатываю C # clent / серверное приложение на основе двух служб Windows, которые настроены на клиентском компьютере (.NET 2) и Windows server 2003.
Иногда я получаю исключение
Не удается прочитать данные из транспортного соединения. Существующее соединение было принудительно закрыто удаленным хостом
Это не происходит с постоянным периодом времени. После перезапуска службы на сервере иногда требуется 2 недели или даже всего 1 день, пока исключение не начнет возникать.
Как мне исправить эту проблему?
Спасибо
Комментарии:
1. Вряд ли есть какая-либо информация, позволяющая хотя бы понять проблему, пожалуйста, опубликуйте некоторый код и сведения об исключении
2. Было бы полезно просмотреть код, в котором возникает исключение, и узнать, на каком конце соединения это происходит. Это исключение обычно означает, что другой конец соединения закрыт. Это может произойти по многим причинам.
Ответ №1:
Звучит как периодические проблемы с сетью. Это довольно распространенное явление в беспроводных сетях, и это также может время от времени происходить в проводных сетях (Ethernet не является детерминированным протоколом). Причины могут быть различными. Однако, в дополнение к устранению ваших сетевых проблем, я бы настоятельно рекомендовал сделать ваш сервис устойчивым к сетевым проблемам.
(Подумайте о простом случае, когда кто-то на короткое время отключает сетевой кабель сервера: Если ваше приложение выходит из строя из-за необработанного исключения, требуется вмешательство администратора, чтобы снова запустить его. Вы этого не хотите. Это не очень хорошее поведение для службы.)
Таким образом, ваша служба должна перехватывать исключения ввода-вывода, вносить запись в журнал приложений Windows и повторять операцию немного позже (чтобы избежать переполнения журнала событий или создания ненужной нагрузки на компьютер или сеть).
Комментарии:
1. Это именно то, что я делаю: перехватываю исключения, записываю их в журнал Windows и повторяю попытку позже, но я хочу понять причину, потому что, как только исключение произошло, оно продолжает происходить, пока я не перезапущу службу на сервере
2. @alexyz: Я вижу! В этом случае вам может потребоваться повторно установить соединение после его потери. Какой тип соединения вы используете? Возможно, было бы полезно показать немного (упрощенного) кода в вашем вопросе.
3. Я не могу вставить некоторый код, потому что машина разработки не подключена к Интернету (и не может быть подключена)
4. @alexyz: Тогда вам, вероятно, потребуется повторно установить TCP-соединение вместо того, чтобы просто повторить операцию отправки.