Я использую WCF для реализации веб-сервиса. Для этого веб-сервиса требуется функция ping в качестве монитора работоспособности для каждого сервиса. Эта функциональность была реализована с использованием IDispatchMessageInspector и настраивается для каждой конечной точки службы. Это связано с деловым требованием, чтобы пинг был как можно ближе к реальному коду обслуживания. В то же время я не хотел привязывать его к коду каждой реализации службы, и IDispatchMessageInspector, похоже, хорошо подходит.
Служба использует запрос-ответ MEP. Каждое сообщение запроса содержит элемент, который указывает, какая обработка требуется. Затем служба будет использовать это значение, чтобы определить, как обрабатывать данные в сообщении. Этот же элемент используется для определения сообщения запроса в качестве проверки «сердцебиения».
Инспектор сообщений «ping» предварительно обработает сообщение запроса в методе AfterReceiveRequest (), и если он определит, что запрос является «сердцебиением», то он сгенерирует правильный ответ и передаст его в BeforeSendReply () метод через объект корреляции, возвращаемый из AfterReceiveRequest (). Параметр сообщения запроса AfterReceiveRequest (), который является ссылкой, затем устанавливается в значение null, чтобы предотвратить обработку сообщения кодом реализации службы.
Техника установки нулевого сообщения запроса была найдена на веб-сайте или в блоге, для которого я не могу вспомнить или найти URL-адрес. Эта методика прекрасно работает сама по себе, и я могу предотвратить выполнение кода реализации службы, если это «сердцебиение» запроса.
К сожалению, установка пустого значения для сообщения запроса в инспекторе сообщений приведет к тому, что среда выполнения WCF будет всегда выдавать исключение NullReferenceException. Из трассировки стека я понимаю, что среда выполнения по-прежнему будет передавать объект сообщения (который будет нулевым после прохождения через инспектор сообщений «Ping») диспетчеру, а когда диспетчер пытается десериализовать объект сообщения с нулевым значением, вызывает исключение NullReferenceException.
Однако в моей системе также реализован IErrorHandler для перехвата любых необработанных исключений в сервисе и его регистрации. Это означает, что каждый успешный запрос «heartbeat» будет генерировать запись в журнале для исключения NullReferenceException, и «heartbeat» может повторяться каждую минуту.
Вопрос:
Что можно сделать, чтобы предотвратить ведение журнала «бесполезного» исключения NullReferenceException, возникающего, когда «Ping» препятствует запуску кода реализации службы, установив для запроса значение null.
Большое спасибо заранее.
~ * 1018 рт.ст. *