自制小工具监控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下一般就无法做 ...
随机推荐
- 重置kafka的offset
如果你在使用Kafka来分发消息,在数据处理的过程中可能会出现处理程序出异常或者是其它的错误,会造成数据丢失或不一致.这个时候你也许会想要通过kafka把数据从新处理一遍,我们知道kafka默认会在磁 ...
- Redis 分区
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集. 分区的优势 通过利用多台计算机内存的和值,允许我们构造更大的数据库. 通过多核和多台计算机,允许我们扩展计算能力:通 ...
- 关于在Android设置全局变量随时获取context
最实在的办法就是继承Application,在里面设置全局变量,因为Application是android的应用入口,并且运行周期贯穿整个程序运行. import android.app.Applic ...
- 手动实现 KVO
来源:伯乐在线 - Jerry4me 链接:http://ios.jobbole.com/88828/ 点击 → 申请加入伯乐在线专栏作者 我的Github地址 : https://github.co ...
- WEB免费打印控件推荐
在WEB系统中,打印的确是个烦人的问题. 要么自己开发打印控件,如果项目时间紧,肯定来不及. 要么购买成熟的打印控件,如果是大项目可以考虑,但如果项目只有几K到1.2W之间,这就麻烦了. 前段时间有机 ...
- A + B Again
Problem Description There must be many A + B problems in our HDOJ , now a new one is coming.Give you ...
- ubuntu16.04 编译安装mysql5.7.x,以及配置使用
編譯與安裝: 源码下载地址:http://dev.mysql.com/downloads/mysql/ 选择Generic Linux (Architecture Independent), C ...
- iOS - 导航控制器
1.导航控制器 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.bac ...
- HDU 1088 Write a simple HTML Browser 有点恶心的字符串题
这题是从某个群里听别人在抱怨这题老是PE,打开status果然满眼的Presentation Error...于是闲着来做了一下. 其实挺水的,不过各种设定多一点,注意一点就行了. 一开始以为词数超过 ...
- input输入框,回车激活按钮事件代码
<input type="text" name="输入框ID" id="输入框ID" onkeypress="if(even ...