【问题标题】:Writing a generic WCF service client config/endpoint checker?编写通用 WCF 服务客户端配置/端点检查器?
【发布时间】:2012-09-20 08:49:33
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 任何带有完整源代码示例的最终解决方案?

标签: c# wcf


【解决方案1】:

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

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

客观地说,这太复杂了,以至于这些人以此为生,我不认为这是你想要自己实际构建的东西。

【讨论】:

  • 谢谢,我以前没有听说过那个特定的产品,但我知道存在这样的产品 - 就我的目的而言,这似乎是一些相当严重的矫枉过正。我完全可以理解,对于这些企业解决方案提供的诊断功能级别,这是一项全职工作,但我无法相信简单地验证是否存在指向您的服务客户端的端点是如此复杂。
【解决方案2】:

你看过WCF Discovery吗?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-03-25
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多