自制小工具监控wcf服务是否正常
由于项目中有2个使用netTcpBinding的wcf服务经常出现无法提供服务的问题,一直找原因也找不到导致影响严重,更换InstanceContextMode和ConcurrencyMode配置也不好使,出现问题后用户反馈,然后我这边在赶紧重启服务就好了,为此先写个小工具实现自动监控服务端程序是否正常如果不正常则实现自动重新启动服务程序功能,这方法只能治标不治本,对wcf了解的朋友可以给出些调试意见。
程序使用devexpress的chartcontrol控件事实滚动界面,看图:
  
折线图每次显示50个点,然后动态删除和新增点保持50个点,然后每次访问接口判断是否可以访问,以及是否访问超时,如果达到设置的次数则,直接执行外部程序实现重启wcf目的,然后等待一会后继续监控:
加载配置,启动任务:
private void FrmMain_Load(object sender, EventArgs e)
{
DataBaseTaskScanningMessage = new EventWaitHandle(false, EventResetMode.AutoReset);
p1 = this.chartControl1.Series[].Points;
p2 = this.chartControl1.Series[].Points; _appFilePath = ReportInfo.Monitor.m.Default._appFilePath;
_pointCount = m.Default._pointCount;
_taskTimeSpan = m.Default._taskTimeSpan;
_timeOutSpan = m.Default._timeOutSpan;
_ntsdPath = m.Default._ntsdPath; Run();
} private void Run()
{
errorCount = ; t = new Thread(() =>
{
try
{
ShowMess("Run......");
taskWait = ThreadPool.UnsafeRegisterWaitForSingleObject(DataBaseTaskScanningMessage, (x, e) => RunSc(), null, _taskTimeSpan, true);
this.btn_start.Invoke((MethodInvoker)(() =>
{
this.btn_start.Enabled = false;
this.btn_stop.Enabled = true;
})); }
catch (Exception ex)
{
ShowMess("服务启动异常:" + ex.ToString());
Log.LogService.LogError(string.Format("服务启动异常:{0}!", ex.ToString()), "btn_start_Click"); this.btn_start.Invoke((MethodInvoker)(() =>
{
this.btn_start.Enabled = true;
this.btn_stop.Enabled = false;
}));
}
});
t.IsBackground = true;
t.Start();
}
核心任务,超过3次则放置一个rest.txt文件,当服务端读取到这个文件存在时就会自杀然后重生,这是为了解决当服务端是通过任务计划system权限执行时,监控程序无权限结束进程的问题:
   #region 定时任务
         public static WaitHandle DataBaseTaskScanningMessage { get; private set; }
         private static RegisteredWaitHandle taskWait;
         public void RunSc()
         {
             try
             {
                 string dt = DateTime.Now.ToString("mm-ss");
                 Stopwatch sw = new Stopwatch();
                 sw.Start();
                 bool state = (new IMServerAgent()).ConnectionTest();
                 sw.Stop();
                 ShowMess(string.Format("执行接口:{0} 结果:{1} 用时:{2}", "Message", state ? "成功" : "=失败=====", sw.ElapsedMilliseconds), !state);
                 if (sw.ElapsedMilliseconds > _timeOutSpan)
                     state = false;
                 if (p1.Count > _pointCount)
                     p1.RemoveAt();
                 p1.Add(new DevExpress.XtraCharts.SeriesPoint(dt, sw.ElapsedMilliseconds));
                 sw.Restart();
                 bool state2 = (new ClientLogInfoAgent()).AddErrorLog("RunSc", "Monitor");
                 sw.Stop();
                 ShowMess(string.Format("执行接口:{0} 结果:{1} 用时:{2}", "Log   ", state2 ? "成功" : "=失败======", sw.ElapsedMilliseconds), !state);
                 if (sw.ElapsedMilliseconds > _timeOutSpan)
                     state2 = false;
                 if (p2.Count > _pointCount)
                     p2.RemoveAt();
                 p2.Add(new DevExpress.XtraCharts.SeriesPoint(dt, sw.ElapsedMilliseconds));
                 #region 判读是否出现异常
                 if (!state || !state2)
                     Interlocked.Increment(ref errorCount);
                 else
                     Interlocked.Exchange(ref errorCount, );
                 if (errorCount >= )
                 {
                     Interlocked.Exchange(ref errorCount, );
                     //异常重启服务
                     if (File.Exists(_appFilePath))
                     {
                         ShowMess("rest......", true);
                         string path = @"D:\ReportServer\WebHelp\rest.txt";
                         if (!System.IO.File.Exists(path))
                         {
                             if (!System.IO.Directory.Exists(Path.GetDirectoryName(path)))
                                 System.IO.Directory.CreateDirectory(Path.GetDirectoryName(path));
                             System.IO.File.WriteAllText(path, DateTime.Now.ToString());
                         }
                         System.Diagnostics.Process.Start(_appFilePath);
                         System.Threading.Thread.Sleep( * );
                         int wCount = ;
                         while (Process.GetProcessesByName("ReportInfo.IMServer").Count() == )
                         {
                             wCount++;
                             if (wCount > )
                                 break;
                             System.Threading.Thread.Sleep();
                         }
                     }
                 }
                 #endregion
             }
             catch (Exception ex)
             {
                 p1.Clear();
                 p2.Clear();
                 ShowMess("RunSc异常:" + ex.ToString());
             }
             finally
             {
                 taskWait = ThreadPool.UnsafeRegisterWaitForSingleObject(DataBaseTaskScanningMessage, (x, e) => RunSc(), null, _taskTimeSpan, true);
             }
         }
         #endregion
毕竟不能根本解决问题,只能起到当有问题时第一时间发现,让用户感觉不到问题的存在。
自制小工具监控wcf服务是否正常的更多相关文章
- 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
		
1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...
 - 自制小工具大大加速MySQL SQL语句优化(附源码)
		
引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...
 - 自制小工具含源码——SPTC上海交通卡余额查询
		
说明 需求 开发 其他
 - WCF服务端开发和客户端引用小结
		
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
 - WCF服务配置编辑器使用
		
学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件= ...
 - IIS监控应用程序池和站点假死,自动重启IIS小工具
		
文章技术适合初学者.高级的C#开发工程师这些估计都熟悉到烂了,望不要喷. 第一.C#代码要操作IIS 就必须先导入 Microsoft.Web.Administration.dll ,方便控制台程序做 ...
 - WCF初探-7:WCF服务配置工具使用
		
在上一篇WCF服务配置中,文章讲解了WCF的配置所需要的基本节点和属性构造,但是对于初学者的我们在编写程序的时候,往往对这些节点的位置和属性不是特别清楚,所以就导致我们的因配置文件错误而不能运行服务程 ...
 - WCF系列教程之WCF服务配置工具
		
本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...
 - 在windows下实时监控、接受文件变化小工具
		
在windows下实时监控文件变化小工具 在测试的时候,我们可能想实时监控系统打出的log信息,在unix系统上我们可以用"tail -f"实现,在windows下一般就无法做 ...
 
随机推荐
- Squish License
			
https://www.froglogic.com/squish/gui-testing/prices-and-licensing/index.php Prices and Licensing Who ...
 - c++ 设计模式3 (重构技法  Template Method)
			
1. 重构 面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指的是那些可以满足 “应对变化,提高复用”的设计. 设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地理解 ...
 - 一步一步实现iOS微信自动抢红包
			
微信红包 前言:最近笔者在研究iOS逆向工程,顺便拿微信来练手,在非越狱手机上实现了微信自动抢红包的功能. 此教程所需要的工具/文件 yololib class-dump dumpdecrypte ...
 - C# 之 集合整理
			
集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问):一个集合包括多个元素,即有一个集合类对象和N个元素对象. BCL(Base Class Library, 基类库) ...
 - a letter and a number
			
描述we define f(A) = 1, f(a) = -1, f(B) = 2, f(b) = -2, ... f(Z) = 26, f(z) = -26;Give you a letter x ...
 - 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[2]--DIH
			
转载:http://quweiprotoss.wap.blog.163.com/w2/ DIH需要在solrconfig.xml中注册,如下: <requestHandler name=&quo ...
 - [Windows] 解决kmplayer播放rmvb文件音视不同步
			
1. 到該帖子 http://www.kmplayer.com/forums/showthread.php?t=8755 下載附件中的4個檔案放到KMP 根 目錄下(此文件已在附件中上传) 2.於KM ...
 - [Java] JSTL格式化时间计算时差
			
引入JSLT标签: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ...
 - android studio1.3安装终于成功
			
本人机器是win7 32位旗舰版,4G内存.以前使用eclipse adt bundle开发Android程序感觉非常方便,但随着google对andriod studio支持力度加大,转向studi ...
 - 瀑布流插件(jquery.masonry.js)
			
什么是瀑布流?去看看Pinterest(这才是鼻祖),Mark之,蘑菇街,点点网,还有腾讯的微博广场吧.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部. Masonry是一款很好用的jqu ...