Какое исключение или код состояния http для случая, когда сервер не работает

Я хочу отслеживать сервер WCF и отправлять уведомления по электронной почте, если сервер не работает. Для этого я пишу консольное приложение, которое периодически отправляет фиктивный запрос на сервер и проверяет, отправляется ли ответ обратно. Когда консольное приложение получило исключение, у сервера возникли проблемы, в том числе сервер не работает.

Однако проблема в том, что я получил разные исключения для разных статусов сервера. Ниже приведены исключения, возвращаемые сервером, когда он находится в другом статусе. Тем не менее, похоже, что все они относятся к категории отключенных серверов. Есть идеи??:

Когда IIS отключен

System.ServiceModel.EndpointNotFoundException,

Сообщение:
На http://localhost/service.svc не было прослушивающей конечной точки, которая могла бы принять сообщение. . Это часто вызвано неверным адресом или действием SOAP. Дополнительные сведения см. в разделе InnerException, если он присутствует.

Внутреннее сообщение об исключении: удаленный сервер вернул ошибку: (404) не найден

Если имя файла Web.config намеренно изменено на неправильное:

System.ServiceModel.ServiceActivationException
Ссылка: http://localhost/service.svc
Сообщение:< br> Запрошенная служба «http://localhost/service.svc» не может быть активирована. Дополнительные сведения см. в журналах диагностической трассировки сервера.

По другой неизвестной причине

System.ServiceModel.ServerTooBusyException
Сообщение:
Служба HTTP, расположенная по адресу http://localhost/service.svc' слишком занят.
Сообщение:
Удаленный сервер вернул ошибку: (503) Сервер недоступен.

Обновление 1

Исключение НЕ всегда возвращает код состояния http.

Обновление 2. Помимо использования прокси-сервера WCF для вызова службы, я также должен использовать WebRequest, как показано ниже:

       try
        {
            WebRequest webRequest = WebRequest.Create(uri);
            webRequest.Method = "GET";

            HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();                             

        }
        catch ()  //what excpetion will tell me server is down??
        {
           ...
        }

person Pingpong    schedule 06.02.2012    source источник


Ответы (2)


Фактическое содержание ошибки на самом деле не должно иметь последствий - если вы не отслеживаете отдельные операции в службе (т. Е. Если POST с некоторыми данными на определенный URL-адрес возвращает определенный ответ) - на самом деле вы будем смотреть на сам код состояния; и для этого вы хотите просмотреть все коды состояния HTTP и увидеть те, которые выглядят как ошибки, насколько вам известно.

В качестве хорошей отправной точки вы можете рассмотреть почти все коды 5xx; так как все они связаны с ошибками сервера.

Вы также можете рассмотреть некоторые из кодов 4xx (хотя они обычно связаны с клиентами, так что будьте безжалостны). Особенно:

400 - Bad Request — при условии, что вы можете быть уверены, что сервер должен понять запрос

404 - Not Found - если вы уверены, что данный URL должен присутствовать

405 - Method Not Allowed – если вы уверены, что данный HTTP-команд должен поддерживаться (например, POST или DELETE)

Для некоторых из более узких кодов 4xx, например. 413 Request Entity Too Large или 414 Request-URI Too Long; это может произойти через несколько дней или месяцев нормальной работы из-за таких вещей, как обновления безопасности. В этом случае вы не обязательно определяете, что служба не работает как таковая, но вы можете предвидеть, что она не сможет выполнять предназначенную для нее функцию.

person Andras Zoltan    schedule 06.02.2012
comment
Спасибо за ваш совет. Исключение НЕ всегда возвращает код состояния http. - person Pingpong; 07.02.2012

Любой код результата состояния HTTP в сериях 400 или 500 является проблемой, которая не позволит вам обработать ваш запрос. Все эти ошибки возникают из-за System.ServiceModel.CommunicationException, поэтому проверьте это.

person JamieSee    schedule 06.02.2012