首页 > 解决方案 > 如何对 WCF 主机进行健康检查?

问题描述

我的组织拥有大量内部使用的复杂 WCF 服务组合。很少(我们每隔几个月谈论一次),在 IIS 的 29 小时周期重置事件之一之后,这些服务中的一项或多项将变得不可用。所有调用服务的尝试都会在服务模型深处产生异常,这与在处理合同时尝试添加故障有关。谷歌在这个问题上的唯一命中是相关的源代码,所以它似乎足够神秘,不值得费心去弄清楚发生了什么,特别是当 IIS 重置修复了这个问题时。相反,我们希望在同一台服务器中构建 WebAPI 健康检查方法,以确保所有服务都可用,请记住,我们监控的不是我们自己的系统,而是 WCF 的健康状况。

我们探索的第一个方法:我们所有的 WCF 服务都有一个自定义的 IServiceBehavior 来初始化各种行为,因此我们向 IServiceBehavior.Validate 添加了一个段,以将所有通过它的端点注册到一个静态列表中。健康检查,当它被轮询时,将包括使用 MetadataExchangeClient 来获取每个注册端点的元数据,任何失败都会被报告回来,因为系统可能需要重置。这在人工测试场景中效果很好,但出现了两个问题:

  1. 鉴于我们要防止的场景是在 IIS 进行自重置之后,仅基于我们拥有的堆栈跟踪,很难判断 IServiceBehavior.Validate 是否真的会在 WCF 爆炸之前被调用来注册服务。
  2. 元数据获取在生产中被禁用,因此无论如何它都没有实际意义。

可以修改每个服务合同以添加一个空的健康检查操作,并让我们的循环在每个端点上调用它。但是有很多服务,如果可以的话,我们宁愿避免修改它们。服务器是否有一些更智能的方法来验证每个服务当前是否能够返回,而无需修改服务本身或依赖元数据?

标签: asp.net.netwcf

解决方案


推荐阅读