检测WCF服务是否在线第二版

上一版在这里https://cloud.tencent.com/developer/article/1013406

上一版主要是解决了监控服务不需要手动添加服务引用的问题,但是还是需要在配置文件中添加对应的endpoint信息,以及需要真正的contract接口的dll文件来实现反射生成wcf通道。

这样其实还是挺繁琐的,每添加一个监控的服务,都需要修改一堆配置,外加复制一堆dll。新版中已经不需要复制真正的contract的dll文件跟endpoint配置了。

上一版我需要contract的dll一是为了反射去创建wcf调用通道,二是为了调用其中一个真正的方法。其实可以使用一个假的contract接口跟一个假的方法来探测就可以。

因为就算使用假的contract接口通道也是可以建立的,调用一个不存在的方法会报一个System.ServiceModel.ActionNotSupportedException的异常,这表明服务是存在的。

然后我们只需要一个假的contract接口:

  [ServiceContract]
    public interface IFakeWcfInterface
    {
        [OperationContract]
        string ThisIsATestMethod();
    }

  然后使用ChanelFactory去构造通道,这次不用反射了,更加简单。为了移除endpoint的配置文件,我们直接手动用代码实例化一个ServiceEndpoint。我这边所有的服务的binding都是统一的,所以可以写死了,如果每个服务的binding等信息都不一样,那么还需要抽象到config文件里了。

测试是否alive:

  private bool IsALive(string endpointName,string url)
        {
            try
            {
                FuncExtension.TryDo(() =>
                {
                    var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IFakeWcfInterface)), new NetTcpBinding(SecurityMode.None), new EndpointAddress(url));
                    var channelFactory = new ChannelFactory<IFakeWcfInterface>(endpoint);
                    var proxy = channelFactory.CreateChannel();

                    try
                    {
                        proxy.ThisIsATestMethod();
                    }
                    catch (Exception exc)
                    {
                        Logger.Trace(
                            string.Format("Try to connect wcf service error:{0}, ExceptionType:{1}", endpointName,
                                exc.GetType()), GetType(), exc);
                        throw;
                    }
                    finally
                    {
                        try
                        {
                            (proxy as ICommunicationObject).Close();
                        }
                        catch
                        {
                            (proxy as ICommunicationObject).Abort();
                        }
                    }

                }, 3);

                return true;
            }
            catch (Exception exc)
            {
                PrintWholeException(exc);
                return !IsHttpOrSocketException(exc);
            }
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]

在进行基于会话信道的WCF服务调用中,由于受到并发信道数量的限制,我们需要及时的关闭信道;当遇到某些异常,我们需要强行中止(Abort)信道,相关的原理,可以参...

1878
来自专栏Android 研究

OkHttp源码解析(十) OKHTTP中连接与请求及总结

主要看下ConnectInterceptor()方法,里面代码已经很简单了,受限了通过streamAllocation的newStream方法获取一个流(Htt...

1273
来自专栏猿人谷

Windows c++应用程序通用日志组件(组件及测试程序下载)

引言   众所周知,在调试、跟踪和执行应用程序的过程中,程序的日志能为这些工作提供大量有价值的运行信息。因此,程序的日志对应用程序的运行、维护至关重要。   在...

1825
来自专栏大内老A

通过WCF扩展实现消息压缩

对于需要进行大规模数据传输的WCF应用来说,对于请求消息和回复消息进行传输前的压缩,不但可以降低网络流量,也可以提高网络传输的性能。由于WCF的扩展性,我们可以...

16810
来自专栏C#

开源的.NET定时任务组件Hangfire解析

   项目中很多时候都会使用到定时任务这样一个功能需求,在.NET中对于完成定时任务的技术还是不怎么多的,.NET Framework具有“内置”定时器功能,通...

3426
来自专栏developerHaoz 的安卓之旅

Android Volley 源码解析(一),网络请求的执行流程

花了好几天,重新研究了 Volley 的源码实现,比起之前又有了一番新的体会,啃源码真的是一件让人纠结的事情,阅读优秀的源码,特别是难度相对较大的源码,一旦陷入...

1054
来自专栏大内老A

使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)

通过前面一系列的博文(《WCF 并发(Concurrency)的本质》、《并发中的同步》、《实践重于理论》、《并发与实例上下文模式》、《回调与并发》、《Conc...

1679
来自专栏逸鹏说道

浅谈命令查询职责分离(CQRS)模式

在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体。在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得...

2554
来自专栏developerHaoz 的安卓之旅

Android Volley 源码解析(二),探究缓存机制

在上一篇文章中,带大家阅读了 Volley 网络请求的执行流程,算是对 Volley 有了一个比较清晰的认识,从这篇文章开始,我们开始针对 Volley 的某个...

1011
来自专栏idba

分布式任务管理系统 Celery 之二

前面一篇文章分布式任务管理系统 Celery 之一介绍了分布式任务调度队列Celery的框架以及原理,使用的例子比较简单,对实际的使用场景没有意义。本系列文章...

893

扫码关注云+社区