使用Message Inspector实现“Ping”功能会导致WCF运行时抛出NullReferenceException

时间:2009-12-01 04:33:02

标签: wcf ierrorhandler

我正在使用WCF来实现Web服务。此Web服务需要“ping”功能作为每项服务的运行状况监视器。此功能已使用IDispatchMessageInspector实现,并为服务的每个端点配置。这是因为“ping”的业务要求尽可能接近实际的服务代码。同时,我不想将它与每个服务实现的代码联系起来,IDispatchMessageInspector似乎很合适。

该服务使用Request-Reply MEP。每个请求消息都包含一个指定所需处理的元素。然后,该服务将使用此值来确定如何处理消息中的数据。相同的元素用于将请求消息定义为“心跳”检查。

'ping'消息检查器将在AfterReceiveRequest()方法中预处理请求消息,如果它确定请求是'heartbeat',它将生成正确的响应并将其传递给BeforeSendReply()通过AfterReceiveRequest()返回的关联对象的方法。然后将AfterReceiveRequest()的请求消息参数(通过引用)设置为null,以防止消息被服务实现代码处理。

在我不记得的网站或博客中找到了将请求消息设置为null的技术,也找不到它的URL。这项技术本身很有用,如果是“心跳”请求,我可以阻止执行服务实现代码。

不幸的是,在消息检查器中将请求消息设置为null将导致WCF运行时始终抛出NullReferenceException。从堆栈跟踪中,我收集运行时仍将消息对象(在通过'Ping'消息检查器后将为null)传递给调度程序,并且当调度程序尝试反序列化空消息对象时,会导致NullReferenceException。

但是,我的系统还实现IErrorHandler来捕获服务中的任何未处理的异常并记录它。这意味着每个成功的'heartbeat'请求都会为NullReferenceException生成一个日志条目,'heartbeat'可以像每分钟一样频繁。

问题:

当“Ping”通过将请求设置为null来阻止服务实现代码运行时,我该怎么做才能防止记录“无用”NullReferenceException。

非常感谢提前 〜汞

1 个答案:

答案 0 :(得分:0)

不是最优雅的解决方案,但潜在的解决方法(我没有测试过),但是你在检查器代码中检测到你的ping调用,你是否可以抛出自己的自定义异常类型,即PingRequestException,并在它返回时处理它对客户?这会避免您访问WCF运行时代码,从而避免记录未处理的异常。

否则,您可以尝试使用由所有服务(wcf运行时代码的另一端)继承的基本服务,该服务在命中实际服务代码之前检测并处理构造函数中的ping请求。