检测WCF服务是否在线(动态执行WCF服务)
在我们的系统里有多个wcf支撑。但是有的时候会莫名的停止,于是今天写了一个服务,定时去检测其他wcf服务是否在线。那么最简单的办法自然是引用其他wcf服务让vs给我们自动生成clientProxy然后一个个去调用是否正常。但是这种办法显然不是我要的。我要弄一个通用的服务检测。
方案1:
对于httpbinding的wcf服务有个最简单的检测方法:就是用httpClient去请求一下服务地址看有没有服务描述xml返回。如果有就是live不然就是服务异常关闭了。这个方法对于net.tcp绑定等不适用。
方案2:
使用反射动态生成channelProxy然后去尝试执行一个方法。当然这个方法最好不是Update等会影响到业务数据的方法,最好是query级别的方法。
正常使用ChannelFactory<T>调用wcf服务:
var channelFactory = new ChannelFactory<T>(endpoint);
var proxy = this._channelFactory.CreateChannel();
proxy.Add(1,2);
很简单,我们只需要把T接口协定,endpoint节点名称,调用的方法名称,以及程序集名称或者路径提取到配置文件里就行了。然后把上面的代码转换成反射代码就行。
看一下最主要的方法吧,废话不多了。
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[];
var createChannelMethod = channelType.GetMethod("CreateChannel", types);
var proxy = createChannelMethod.Invoke(channel, null);
try
{
var testMethod = apiType.GetMethod(testMethodName);
var patameterInfos = testMethod.GetParameters();
List<object> parameters = new List<object>();
foreach (var patameterInfo in patameterInfos)
{
var defaultValue = patameterInfo.ParameterType.IsValueType
? Activator.CreateInstance(patameterInfo.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();
}
} }, ); 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;
}
其中FuncExtension.TryDo是自动尝试一个Actoin的封装,不影响理解反射的代码。
我们的目的是判断wcf是否还live,所以不要在意返回值。我们只要判断这次调用的异常是否是SocketException或者EndpointNotFindException即可。
这样,当需要监控新的wcf服务的时候只要在配置文件里添加一行协定,程序集,调用方法,endpoint的配置即可,当然协定所在的dll要复制到程序的跟目录下或者指定的文件下。
检测WCF服务是否在线(动态执行WCF服务)的更多相关文章
- 动态的调用服务端的WCF中的方法
客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法. 主要为,动态绑定,反射动态调用. public static object Execu ...
- 动态调用WCF服务
动态调用WCF服务,只需要提供*.svc地址, 1:命名空间: using System.ServiceModel.Channels;using System.ServiceModel; 2:创建访问 ...
- 创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址
一.创建WCF服务器 1.创建WCF服务器的窗体应用程序 打开VS2010,选择文件→新建→项目菜单项,在打开的新建项目对话框中,依次选择Visual C#→Windows→Windows窗体应用程序 ...
- 记录:Web无引用无配置方式动态调用WCF服务
这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务 ...
- 动态调用WCF
最近在做的一个项目中需要动态调用WCF地址,因为有很多终端服务器,而每台终端服务器上都部署一个WCF服务,中央服务器需要不定时调用其中某个或者多个WCF服务执行相关操作,因此添加引用及配置文件配置的方 ...
- c# 动态调用WCF方法笔记!
//动态调用wcf方法 string url = "http://localhost:54379/ServiceWCF.svc"; IDoubleService proxy = W ...
- C#动态调用WCF接口,两种方式任你选。
写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...
- 【WCF全析(一)】--服务协定及消息模式
上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软 ...
- WCF学习心得------(三)配置服务
配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...
随机推荐
- C语言结构体-struct
知识点: 1)结构体的定义. 2)结构体的sizeof. 3) 结构体的指针. 1) 结构体的定义: 在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct.下面我将 ...
- WPF 编辑状态切换
有时候DataGrid编辑的时候一个属性需要根据别的属性呈现不同的编辑状态.这就需要一个做一个状态切换.比如地址是1的时候,读写类型是读写.只读.只写.地址是2的时候,就只读.状态栏切换为TextBo ...
- 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
这篇文章解决了在StackOverflow上一个经常被提到的问题. 在配置发生变化(Configuration changs)时,什么是最好的保存活动对象方法,比如运行中的线程,Sockets,Asy ...
- [ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列 ...
- 初识jsonp
jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案.很多时候我们需要在客户端获取服务器数据进行操作,一般我们会使用ajax+webservice做此事,但是如 ...
- linux下进程间通信
信号 信号是进程间相互传递消息的一种方法,只是用来通知某进程发生了什么事件,并不给进程传递任何数据. #include <sys/types.h> #include <unistd. ...
- C-Lodop 非典型应用
Lodop是什么? 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白: 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动 ...
- Linux内核TCP/IP参数分析与调优
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/167.html?1456482565 如下图展示的是TCP的三个阶段.1,TCP三次握手. ...
- 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)
回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...
- Android笔记——了解SDK,数据库sqlite的使用
一.adb是什么? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具 ...