检测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学习心得------(三)配置服务
配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...
随机推荐
- 自动升级系统OAUS的设计与实现(续) (附最新源码)
(最新OAUS版本请参见:自动升级系统的设计与实现(续2) -- 增加断点续传功能) 一.缘起 自从 自动升级系统的设计与实现(源码) 发布以后,收到了很多使用者的反馈,其中最多的要求就是希望OAUS ...
- FusionCharts简单教程(六)------加载外部Logo
一.加载外部文件Logo 在使用FusionCharts时,我们可能需要在加载图像的时候需要在图表中显示标识.图片等等.这里我们可以使用logoURL属性来实现.如: <chart ...
- 分享一个U3D在Runtime显示碰撞盒的插件
有些时候,我们需要在Game视图显示碰撞盒,比如格斗游戏我要开发碰撞配置的工具,我经常需要看到碰撞盒,今天找了一下,没有发现合适的插件,我还花5美金买了一个插件,结果也只是在scene视图显示,这里我 ...
- Lucene系列-分析器
分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...
- [_CN] Eclipse精要与高级开发技术 note
一 eclipse是基于java的 ide ,但根据其体系结构,开发插件,也可拓展到其他语言———————— 尽管如此,但还是很少听说用eclipse来写php或者c的 跨os 三个项目:eclips ...
- 使用Vue.js时,对Chrome控制台的一点小心得
之前对Chrome控制台的console.log()输出没太放心上,其实仔细研究后,对工作效率有显著的提示.看下面的五段代码: console.log(''); console.log(typeof ...
- Redis教程(十三):管线详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/141.html 一.请求应答协议和RTT: Redis是一种典型的基于C/ ...
- 破解Excel密码保护文件
首先打开vba编辑器,输入代码: Public Sub AllInternalPasswords() ' Breaks worksheet and workbook structure passwor ...
- poj2513Colored Sticks(无向图的欧拉回路)
/* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...
- poj 3352Road Construction(无向双连通分量的分解)
/* 题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为强连通图(指的是边强联通). 思路:利用tarjan算法找出所有的双联通分量!然后根据low[]值的不同将双联通分量 进行缩点,最后图 ...