我正在使用 WCF 来实现 Web 服务。此 Web 服务需要“ping”功能作为每个服务的运行状况监视器。此功能已使用 IDispatchMessageInspector 实现,并针对服务的每个端点进行了配置。这是由于业务要求“ping”尽可能接近实际服务代码。同时,我不想将它绑定到每个服务实现的代码,而 IDispatchMessageInspector 似乎很合适。
该服务使用请求-回复 MEP。每个请求消息都包含一个元素,该元素指定需要进行哪些处理。然后服务将使用此值来确定如何处理消息中的数据。相同的元素用于将请求消息定义为“心跳”检查。
“ping”消息检查器将在 AfterReceiveRequest() 方法中预处理请求消息,如果它确定请求是“心跳”,它将生成正确的响应并通过 a 将其传递给 BeforeSendReply() 方法从 AfterReceiveRequest() 返回的相关对象。AfterReceiveRequest()的请求消息参数,通过引用,然后设置为null,以防止消息被服务实现代码处理。
在我不记得也找不到 URL 的网站或博客中发现了将请求消息设置为 null 的技术。这种技术本身就很有效,如果它是一个“心跳”请求,我可以阻止服务实现代码被执行。
不幸的是,在消息检查器中将请求消息设置为 null 将导致 WCF 运行时始终抛出 NullReferenceException。从堆栈跟踪中,我收集运行时仍会将消息对象(通过“Ping”消息检查器后将为空)传递给调度程序,并且当调度程序尝试反序列化空消息对象时,会导致 NullReferenceException。
但是,我的系统还实现了 IErrorHandler 来捕获服务中任何未处理的异常并记录它。这意味着每个成功的“心跳”请求都会为 NullReferenceException 生成一个日志条目,并且“心跳”可能会像每分钟一样频繁。
问题:
当“Ping”通过将请求设置为空来阻止服务实现代码运行时,我能做些什么来防止记录“无用”NullReferenceException。
提前谢谢了。
〜汞