我有一些 WCF 服务已经测试了一段时间了。我们使用 Windows Process Activation Services (WAS) 将它们托管在 IIS 中。当客户连接时,服务就会启动,我们很高兴。
现在,像我一样偏执,在我们发布这个东西之前,我想测试一系列与服务如何处理某些类型的故障相关的边缘案例。其中一项实验涉及为特定服务创建 ServiceHost 本身期间的失败。
我们有一个自定义的 ServiceHostFactory(派生自 ServiceHostFactoryBase),它执行一些初始化工作并返回一个完全配置的服务主机。我正在模拟一个配置错误,该错误会导致 CreateServiceHost 在初始化期间引发 ServiceActivationException。我们还记录异常。
[顺便说一句,当我们的客户看到这个异常时,他们会停止尝试访问该服务(假设如果它第一次未能激活,则需要人工参与)。这与例如 EndpointNotFoundException 不同,在这种情况下,客户端会定期尝试,假设网络条件是瞬态的。]
我们看到的是客户端尝试(一次)打开服务的通道。ServiceHostFactory 似乎在几秒钟内多次尝试激活服务,每次尝试都失败并显示预期的异常消息,然后应用程序池似乎只是锁定了。对该应用程序池中运行的其他服务(已成功激活)的调用将永远挂起。
这似乎很奇怪。我不介意在几次尝试激活失败后,失败的服务会从应用程序池中启动,但杀死其他服务似乎是错误的。请注意,应用程序池不会回收或停止——它只是坐在那里不响应对任何服务操作的请求。
我还应该做些什么来告诉 WCF 未能激活一项服务应该使该服务“脱机”但允许应用程序池中的其他服务继续处理请求?还是我错过了 WAS 更基本的东西?