我有一个使用许多服务的客户端应用程序。当服务关闭或配置不正确时,这并不总是很明显。我拥有大部分服务的服务端代码和托管,但不是全部。这是一个真正的客户端代理混合包 - 不同的绑定 (basichttp/wshttp/nettcp),一些是使用 svcutil.exe 生成的,而另一些是使用 ChannelFactory 以编程方式制作的,其中合约在一个公共程序集中。但是,我始终可以访问地址、绑定和合同。
我想在我的客户端应用程序中有一个组件,它可以对绑定/端点配置和服务可用性进行基本检查(显示在客户端的某些诊断面板中)。至少我只想知道在配置的地址上有一个端点,更好的是找出端点是否响应并支持客户端尝试使用的绑定。
我尝试使用谷歌搜索并惊讶于我没有找到一个示例(也许已经是一个不好的迹象),但我认为这不会那么难,我所要做的就是创建一个客户端通道并尝试 open() 和close() 捕获发生的任何异常,并在必要时中止()。
我错了 - 特别是对于使用 BasicHttpBinding 的客户端,我可以指定任何端点地址,并且能够毫无例外地打开和关闭。
这是我的实现的精简版本,实际上我返回的是关于异常类型和端点地址的更详细的信息,但这是基本结构。
public class GenericClientStatusChecker<TChannel> : ICanCheckServiceStatus where TChannel : class
{
public GenericClientStatusChecker(Binding binding, EndpointAddress endpoint)
{
_endpoint = endpoint;
_binding = binding;
}
public bool CheckServiceStatus()
{
bool isOk = false;
ChannelFactory<TChannel> clientChannelFactory = null;
IClientChannel clientChannel = null;
try
{
clientChannelFactory = new ChannelFactory<TChannel>(_binding, _endpoint);
}
catch
{
return isOk;
}
try
{
clientChannel = clientChannelFactory.CreateChannel() as IClientChannel;
clientChannel.Open();
clientChannel.Close();
isOk = true;
}
catch
{
if (clientChannel != null)
clientChannel.Abort();
}
return isOk;
}
}
[Test]
public void CheckServiceAtNonexistentEndpoint_ExpectFalse()
{
var checker = new GenericClientStatusChecker<IDateTimeService>(new BasicHttpBinding(), new Endpointaddress("http://nonexistenturl"));
// This assert fails, because according to my implementation, everything's ok
Assert.IsFalse(checker.CheckServiceStatus());
}
我还尝试了一种类似的技术,使用一个虚拟的 testclient 类来实现 ClientBase 并获得相同的结果。我想如果我知道我的所有服务合同都实现了一个通用的 CheckHealth() 方法,那可能是可能的,但是由于某些服务不在我的控制范围内,我什至不能这样做。
那么,是否有可能编写这样一个简单的通用通用服务检查器?如果是这样怎么办?(如果没有,为什么不呢?)
谢谢!