zoukankan      html  css  js  c++  java
  • 检测WCF服务是否在线第二版

    上一版在这里http://www.cnblogs.com/kklldog/p/4878296.html

    上一版主要是解决了监控服务不需要手动添加服务引用的问题,但是还是需要在配置文件中添加对应的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);
                }
            }
    

      

  • 相关阅读:
    认知实习(杭钢、杭州中萃)
    Head of a Gang (map+邻接表+DFS)
    Sharing
    Hello World for U (20)
    计算器(delphi)
    CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍
    关于阿里如何吸引大学生用户理财的一些个人看法
    分页 存储过程
    点击退出,并未直接跳转到登陆界面,登录界面还停留在框架集界面
    梦幻之旅--地图编辑器开发
  • 原文地址:https://www.cnblogs.com/kklldog/p/5011035.html
Copyright © 2011-2022 走看看