2

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

那么,是否有可能编写这样一个简单的通用通用服务检查器?如果是这样怎么办?(如果没有,为什么不呢?)

谢谢!

4

2 回答 2

1

你看过WCF 发现吗?

WCF Discovery 允许客户端根据不同的条件搜索服务,包括合同类型、绑定元素、命名空间、范围和关键字或版本号。WCF Discovery 启用运行时和设计时发现。向您的应用程序添加发现可用于启用其他场景,例如容错和自动配置。

对于第一次尝试,您可以查询端点以查看它是否支持预期的合同。

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

于 2012-09-28T16:53:35.583 回答
0

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

这里有几个视频也可以展示它:

换个角度来看,这太复杂了,以至于这些人以此为生,我不认为这是你想要自己真正建立的东西。

于 2012-09-28T13:01:34.853 回答