编写通用WCF服务客户端配置/端点检查程序?

时间:2012-09-28 12:58:50

标签: c# wcf

我有一个消耗大量服务的客户端应用程序。当服务中断或配置不正确时,并不总是很明显。我拥有服务端代码并托管大多数服务,但不是全部。它是一个真正混合的客户端代理包 - 不同的绑定(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()方法,但是由于某些服务不在我的控制范围内,我甚至不能这样做。

那么,甚至可以编写这样一个简单的通用通用服务检查程序吗?如果是这样怎么样? (如果没有,为什么不呢?)

谢谢!

2 个答案:

答案 0 :(得分:1)

你看过WCF Discovery吗?

  

WCF发现允许客户端基于搜索服务   不同的标准,包括合同类型,约束要素,   命名空间,范​​围和关键字或版本号。 WCF发现   启用运行时和设计时发现。添加发现到您的   应用程序可用于启用其他方案,例如故障   公差和自动配置。

首次尝试时,您可以查询端点以查看它是否支持预期的合同。

最大的好处是,您可以让客户端“发现”它想要在运行时与之通信的服务。这消除了您可能习惯看到的许多客户端配置错误。

答案 1 :(得分:0)

您需要查看SO-AWARE。它是一种Web服务管理工具,可以在整个组织中管理基于SOAP或REST WCF的服务。此外,它还有一个Test Workbench!

以下是一些视频展示:

从透视的角度来看,这是非常复杂的,以至于这些人以此为生,我认为这不是你想要实际建立的东西。