检测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 条评论
登录 后参与评论

相关文章

来自专栏工科狗和生物喵

FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

---- 1. 本次作业的考察要点: 作业地址:https://github.com/HustWolfzzb/STM32F429DiscoveryFreeRTO...

1.1K6
来自专栏大内老A

WCF后续之旅(11): 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作,比如异步地进行基于文件系统的IO操作;异步地调用Web Service;或者是异步地进行数据库访问等等,是和具体的线程无关的。也就是说,对...

23810
来自专栏kl的专栏

spring batch数据库表数据结构

博客因为域名未被实名被暂停解析,申请实名加审批到域名重新可用,上下折腾导致博客四五天不能访问,这期间也成功了使用spring batch Integration...

4518
来自专栏大内老A

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

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

1769
来自专栏杨建荣的学习笔记

关于ORA-01779问题的分析和解决 (r4笔记第22天)

最近同事问我一个问题,是关于一个update语句的问题,需求有点特别,结果在使用update语句尝试了各种方法后,仍然是不依不饶的报出ORA-01779的错误。...

3547
来自专栏技术小讲堂

iBatis.Net(5):Data Map(了解)

总算,总算,能写点示例啦,呵呵,其实前面的几篇,我感觉自己写的也很生硬,没有Demo理解起来是很困难,很多名词,反正我初次接触iBatis的时候,是一点也不理解...

3406
来自专栏函数式编程语言及工具

Akka(10): 分布式运算:集群-Cluster

   Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署。用Akka开发同一版本的分布式程序可以在任何硬件环境中运行,这样我们就可以确定以...

5989
来自专栏纯洁的微笑

springboot(十一):Spring boot中mongodb的使用

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,...

3686
来自专栏大内老A

WCF后续之旅(11): 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作,比如异步地进行基于文件系统的IO操作;异步地调用Web Service;或者是异步地进行数据库访问等等,是和具体的线程无关的。也就是说,对...

1957
来自专栏Golang语言社区

Go语言开发RESTFul JSON API

也许我们之前有使用过各种各样的API, 当我们遇到设计很糟糕的API的时候,简直感觉崩溃至极。希望通过本文之后,能对设计良好的RESTful API有一个初步认...

1.3K3

扫码关注云+社区

领取腾讯云代金券