Реализация функциональности «Ping» с помощью инспектора сообщений заставляет среду выполнения WCF генерировать исключение NullReferenceException - PullRequest
1 голос
/ 01 декабря 2009

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

Служба использует запрос-ответ MEP. Каждое сообщение запроса содержит элемент, который указывает, какая обработка требуется. Затем служба будет использовать это значение, чтобы определить, как обрабатывать данные в сообщении. Этот же элемент используется для определения сообщения запроса в качестве проверки «сердцебиения».

Инспектор сообщений «ping» предварительно обработает сообщение запроса в методе AfterReceiveRequest (), и если он определит, что запрос является «сердцебиением», то он сгенерирует правильный ответ и передаст его в BeforeSendReply () метод через объект корреляции, возвращаемый из AfterReceiveRequest (). Параметр сообщения запроса AfterReceiveRequest (), который является ссылкой, затем устанавливается в значение null, чтобы предотвратить обработку сообщения кодом реализации службы.

Техника установки нулевого сообщения запроса была найдена на веб-сайте или в блоге, для которого я не могу вспомнить или найти URL-адрес. Эта методика прекрасно работает сама по себе, и я могу предотвратить выполнение кода реализации службы, если это «сердцебиение» запроса.

К сожалению, установка пустого значения для сообщения запроса в инспекторе сообщений приведет к тому, что среда выполнения WCF будет всегда выдавать исключение NullReferenceException. Из трассировки стека я понимаю, что среда выполнения по-прежнему будет передавать объект сообщения (который будет нулевым после прохождения через инспектор сообщений «Ping») диспетчеру, а когда диспетчер пытается десериализовать объект сообщения с нулевым значением, вызывает исключение NullReferenceException.

Однако в моей системе также реализован IErrorHandler для перехвата любых необработанных исключений в сервисе и его регистрации. Это означает, что каждый успешный запрос «heartbeat» будет генерировать запись в журнале для исключения NullReferenceException, и «heartbeat» может повторяться каждую минуту.

Вопрос:

Что можно сделать, чтобы предотвратить ведение журнала «бесполезного» исключения NullReferenceException, возникающего, когда «Ping» препятствует запуску кода реализации службы, установив для запроса значение null.

Большое спасибо заранее.
~ * 1018 рт.ст. *

1 Ответ

0 голосов
/ 01 декабря 2009

Не самое изящное решение, но потенциальные обходные пути (которые я не проверял), но там, где вы обнаруживаете свои пинг-вызовы в коде инспектора, вы не могли бы выбросить свой собственный тип исключительной ситуации, например PingRequestException, и обработать это, когда он вернется клиенту? Это позволит избежать попадания в код времени выполнения WCF, что позволит избежать регистрации необработанных исключений.

В противном случае вы можете попытаться использовать базовый сервис, унаследованный всеми вашими сервисами (другая сторона кода времени выполнения wcf), который обнаруживает и обрабатывает запросы ping в конструкторе, прежде чем выполнить действительный код сервиса.

...