博客
关于我
检测WCF服务是否在线(动态执行WCF服务)
阅读量:433 次
发布时间:2019-03-06

本文共 3416 字,大约阅读时间需要 11 分钟。

在我们的系统中,面对多个WCF服务的监控问题,经常会遇到某些WCF服务莫名其休止的情况。这促使我们开发了一个定时检测服务,定期检查各个WCF服务的状态。为了实现这一功能,我们需要一个通用的检测方案,而不是简单地通过引用其他WCF服务生成客户代理去逐一调用。

方案一:检测HTTP绑定的WCF服务

对于HTTP绑定的WCF服务,检测其是否在线的最简单方法是使用HttpClient发送请求到服务的地址,查看是否能获取到服务描述的XML。如果服务在线,返回的结果会包含服务描述信息;如果服务未在线,可能会返回404错误或其他异常。

这种方法适用于HTTP绑定的服务,但不适用于如NetTcp等其他绑定方式的服务。

方案二:反射生成通用检测代理

另一个方法是利用反射技术动态生成通用的ChannelProxy,并尝试调用特定的方法来检测服务的状态。这种方法需要谨慎选择检测方法,通常选择不会影响业务逻辑的查询级别方法。

以下是一个使用反射技术检测WCF服务状态的示例:

private bool IsLive(string assemblyName, string apiServiceFullName, string endpointName, string testMethodName){    var basePath = AppDomain.CurrentDomain.BaseDirectory;    Type apiType = null;    var asm = Assembly.LoadFrom(basePath + "/services/" + assemblyPath);    apiType = asm.GetType(apiServiceFullName);    var channelType = typeof(ChannelFactory<>).MakeGenericType(apiType);        try    {        FuncExtension.TryDo(() =>        {            var channel = Activator.CreateInstance(channelType, endpointName);            Type[] types = new Type[0];            var createChannelMethod = channelType.GetMethod("CreateChannel", types);            var proxy = createChannelMethod.Invoke(channel, null);                        try            {                var testMethod = apiType.GetMethod(testMethodName);                var parameterInfos = testMethod.GetParameters();                List parameters = new List();                                foreach (var parameterInfo in parameterInfos)                {                    var defaultValue = parameterInfo.ParameterType.IsValueType                        ? Activator.CreateInstance(parameterInfo.ParameterType)                        : null;                    parameters.Add(defaultValue);                }                                testMethod.Invoke(proxy, parameters.ToArray());            }            catch (Exception exc)            {                Logger.Error(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);    }}private void PrintWholeException(Exception exc){    Logger.Error(exc.GetType().ToString(), GetType(), exc);    if (exc.InnerException != null)    {        PrintWholeException(exc.InnerException);    }}private bool IsHttpOrSocketException(Exception exc){    if (exc is EndpointNotFoundException || exc is SocketException)    {        return true;    }    else    {        if (exc.InnerException != null)        {            return IsHttpOrSocketException(exc.InnerException);        }    }    return false;}

工作原理说明

  • 加载服务assembly:从指定路径加载包含目标WCF服务的assembly,获取服务接口类型。
  • 反射生成ChannelFactory:使用反射技术生成对应的ChannelFactory实例。
  • 创建通道代理:通过反射调用CreateChannel方法,生成通道代理。
  • 调用检测方法:调用用户定义的检测方法,传递必要的参数。
  • 异常处理:捕捉可能发生的异常,判断是否为HTTP或Socket相关异常,决定是否视为服务未在线。
  • 配置说明

    要实现上述检测逻辑,需要在配置文件中配置以下信息:

    • 服务接口协定:目标WCF服务的接口定义,通常放在配置文件中或使用MVC的路由配置。
    • 端点配置:目标WCF服务的端点配置,包括地址、绑定信息等。
    • 测试方法:在接口中定义一个用于检测服务状态的方法,通常没有副作用。
    • 程序集路径:确保反射加载所需的assembly,建议将其复制到项目根目录或指定路径。

    这种方法的核心优势在于其通用性,通过动态反射可以支持多种绑定方式的WCF服务,只需配置相应的接口和检测方法即可无缝集成。

    转载地址:http://hxdyz.baihongyu.com/

    你可能感兴趣的文章
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>