由于项目中有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服务是否正常的更多相关文章

  1. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  2. 自制小工具大大加速MySQL SQL语句优化(附源码)

    引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...

  3. 自制小工具含源码——SPTC上海交通卡余额查询

    说明 需求 开发 其他

  4. WCF服务端开发和客户端引用小结

    1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...

  5. WCF服务配置编辑器使用

    学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件= ...

  6. IIS监控应用程序池和站点假死,自动重启IIS小工具

    文章技术适合初学者.高级的C#开发工程师这些估计都熟悉到烂了,望不要喷. 第一.C#代码要操作IIS 就必须先导入 Microsoft.Web.Administration.dll ,方便控制台程序做 ...

  7. WCF初探-7:WCF服务配置工具使用

    在上一篇WCF服务配置中,文章讲解了WCF的配置所需要的基本节点和属性构造,但是对于初学者的我们在编写程序的时候,往往对这些节点的位置和属性不是特别清楚,所以就导致我们的因配置文件错误而不能运行服务程 ...

  8. WCF系列教程之WCF服务配置工具

    本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...

  9. 在windows下实时监控、接受文件变化小工具

    在windows下实时监控文件变化小工具   在测试的时候,我们可能想实时监控系统打出的log信息,在unix系统上我们可以用"tail -f"实现,在windows下一般就无法做 ...

随机推荐

  1. Laravel 5.0 之命令及处理程序

    本文译自 Matt Stauffer 的 系列文章 . 本文中涉及的新功能都是关于 Commands 的,这些特性在 Laravel 旧版本中已经有了,但是在 Laravel 5.0 中变得更加好用了 ...

  2. linux 下 奇怪的 动态库 依赖问题

    转:http://fanwei51880.blog.163.com/blog/static/3240674020111145285375/ 总结如下:1)当你在编译生成静态库的时候, 只需要相应的依赖 ...

  3. 客户端动态化系列之——Weex

    来源:kuailejim 链接:http://www.jianshu.com/p/ea25fd834944 客户端动态化系列之--URLRoute 在前端越来越火的年代,逐渐衍生出类似React Na ...

  4. Json.Net学习.集合序列化.

    只要集合实现了IEnumable接口就可以进行序列化 Json序列化器为序列化及反序列化集合对象提供了良好的支持. ->Serializing 为了序列化一个集合---一个泛型的list,arr ...

  5. Android小项目之八 界面细节

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  6. ASP.NET FormsAuthentication跨站点登录时绝对地址返回的问题

    关键字:FormsAuthentication, loginUrl, ReturnUrl, AbsoluteUri 在ASP.NET应用程序中,FormsAuthentication几乎是标配,但Fo ...

  7. asp.net mssqlserver 存储过程

    mssql server 返回多表结果集 mssqlserver 代码 create PROCEDURE [dbo].[gd] AS BEGIN , , END C#代码 using (SqlConn ...

  8. 元数据metadata 对IO有多大影响

    日志文件系统(journaling file systems)可防止系统崩溃时导致的数据不一致问题.对文件系统元数据(metadata)的更改都被保存在一份单独的日志里,当发生 系统崩溃时可以根据日志 ...

  9. 转: 视频相关的协议族介绍(rtsp, hls, rtmp)

    转自: http://www.zhihu.com/question/20621558   作者:杨华链接:http://www.zhihu.com/question/20621558/answer/1 ...

  10. 触发器修改后保存之前的数据 表中插入数据时ID自动增长

    create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...