自制小工具监控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下一般就无法做 ...
随机推荐
- 解决Intellij IDEA 通过archetype创建Maven项目缓慢的问题
1.由于默认情况下,根据archetype创建maven项目会从网络下载catalog文件,导致创建maven项目缓慢 Searching for remote catalog: http://rep ...
- JSONP 跨域解决办法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 7. Android框架和工具之 android-percent-support-lib-sample(百分比支持)
1. android-percent-support-lib-sample介绍: 谷歌最新的百分比布局库的示例项目.其实LinearLayout的layout_weight也能实现百分比效果,不过这个 ...
- android网络请求库volley方法详解
使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列 ...
- 个人总结ANDROID开发事项
theme:none,Holo Dark(全黑),Holo Light(全白),Holo Light width Dark action Bar(全白,活动栏是黑) Create Activity: ...
- 《算法导论》习题解答 Chapter 22.1-6(求universal sink 通用汇点)
思路:设置两个游标i指向行,j指向列,如果arr[i][j]==1,则i=max{i+1,j},j++:如果arr[i][j]==0,则j=max{i+1,j+1}. 伪代码: has_univers ...
- emWin使用外部SRAM的方法
我用的是stm32,加了1MB的外部SRAM,在使用emWin的时候,将一部分内存分配给emWin使用.其实方法很简单,传入SRAM数据总线地址即可,数据位宽我采用16bit,因为使用的SRAM是16 ...
- Kinect For Windows V2开发日志八:侦测、追踪人体骨架
简介 Kinect一个很强大的功能就是它可以侦测到人体的骨骼信息并追踪,在Kinect V2的SDK 2.0中,它最多可以同时获取到6个人.每个人25个关节点的信息,并且通过深度摄像头,可以同时获取到 ...
- java的技术调用栈图示例
- PHP插件技术-插件钩子(hooks)分析
最近准备做一个开源的个人博客系统,因为在构想中要添加插件功能,所以就研究了一下插件功能的实现方法. 插件的功能按照本人自己的理解就是对已有的程序进行功能方面的添加以及改进,插件要与程序所提供的接口进行 ...