使用命名管道NamedPipe在webform与windows服务之间通信
在近日开发的一个web项目中,有这么一个需求:一些统计数据需要实时生成,并保存在数据库或文件中。
可以实现的方法有很多,比如:
1、在web代码中实现,每一个关联操作之后调用一次统计代码
2、使用数据库触发器
3、使用系统自带的计划任务,定时执行
4、数据库代理定时执行
5、使用命名管道触发windows服务后台执行
以上几种方法各有各的好处,也有弊端
第一种方法,如果统计不耗时,那么对用户影响较小,但如果是耗时操作,则会影响整个WEB的运行
第二种方法,触发器不便于维护
第三种和第四种方法的弊端很明显,不能做到实时,而且定时访问数据库也会造成不必要的资源浪费。
在综合考虑下使用了第五种方法,即在关联操作完成之后,webform通过命名管道发送一个信号给windows服务,由windows服务在后台执行,不仅避免了资源的浪费,而且耗时的操作不会影响前端web的运行。
关于命名管道的用法请参考MSDN。在此贴出主要代码:
服务端代码:
1 while (run) 2 { 3 using (NamedPipeServerStream pipe = new NamedPipeServerStream("pipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 10, 10, ps)) 4 { 5 pipe.WaitForConnection(); 6 string message; 7 using (StreamReader sr = new StreamReader(pipe)) 8 { 9 message = sr.ReadToEnd();//message为webform传递过来的指令 10 //根据指令执行相应的操作 11 12 switch (message) 13 { 14 case "a": 15 DoSomeThing(); 16 break; 17 case "b": 18 DoSomeThing(); 19 break; 20 21 22 } 23 } 24 25 } 26 }
WEB端代码:
1 public static void SendPipeMessage(string message) 2 { 3 try 4 { 5 using (NamedPipeClientStream pipe = new NamedPipeClientStream(".", "pipe")) 6 { 7 pipe.Connect(10000); 8 using (StreamWriter sr = new StreamWriter(pipe)) 9 { 10 sr.AutoFlush = true; 11 sr.Write(message); 12 } 13 } 14 } 15 catch 16 { } 17 }
浙公网安备 33010602011771号