我有一个消耗大量服务的客户端应用程序。当服务中断或配置不正确时,并不总是很明显。我拥有服务端代码并托管大多数服务,但不是全部。它是一个真正混合的客户端代理包 - 不同的绑定(basichttp / wshttp / nettcp),一些是使用svcutil.exe生成的,而另一些是使用ChannelFactory编程的,其中契约是在一个公共程序集中。但是,我总是可以访问地址,绑定和合同。
我希望在我的客户端应用程序中有一个组件可以执行绑定/端点配置和服务可用性的基本检查(在客户端的某些诊断面板中显示)。至少我只想知道在配置的地址上有一个端点,更好的方法是找出端点是否响应并支持客户端尝试使用的绑定。
我尝试使用谷歌搜索并感到惊讶,我没有找到一个例子(也许已经是一个糟糕的标志)但我认为它不会那么难,我所要做的就是创建一个客户端通道并尝试打开()和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()方法,但是由于某些服务不在我的控制范围内,我甚至不能这样做。
那么,甚至可以编写这样一个简单的通用通用服务检查程序吗?如果是这样怎么样? (如果没有,为什么不呢?)
谢谢!
答案 0 :(得分:1)
你看过WCF Discovery吗?
WCF发现允许客户端基于搜索服务 不同的标准,包括合同类型,约束要素, 命名空间,范围和关键字或版本号。 WCF发现 启用运行时和设计时发现。添加发现到您的 应用程序可用于启用其他方案,例如故障 公差和自动配置。
首次尝试时,您可以查询端点以查看它是否支持预期的合同。
最大的好处是,您可以让客户端“发现”它想要在运行时与之通信的服务。这消除了您可能习惯看到的许多客户端配置错误。
答案 1 :(得分:0)