1

我正在使用 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。

提前谢谢了。
〜汞

4

1 回答 1

0

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

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

于 2009-12-01T11:32:38.870 回答