日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

基于SignalR实现B/S系统对windows服务运行状态的监测

發(fā)布時間:2024/9/20 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于SignalR实现B/S系统对windows服务运行状态的监测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通常來講一個BS項目肯定不止單獨的一個BS應(yīng)用,可能涉及到很多后臺服務(wù)來支持BS的運行,特別是針對耗時較長的某些任務(wù)來說,Windows服務(wù)肯定是必不可少的,我們還需要利用B/S與windows服務(wù)進行交互,來實現(xiàn)更好的用戶體驗,搭配redis,memcached等來實現(xiàn)分布式緩存,消息列隊處理等等。。。

但是通常情況我們在B/S端是無法得知其依賴的windows服務(wù)當(dāng)前處于什么樣的運行狀態(tài),只能通過到server里面去進行查看,或者通過其他途徑!

今天我們就通過SignalR來實現(xiàn)一個B/S端對windows服務(wù)運行狀態(tài)的監(jiān)控,這里我們用SignalR selfHost,不依賴IIS,然后利用topshelf把SignalR Server部署成windows服務(wù),然后在B/S端通過SignalR js client進行連接獲取服務(wù)運行狀態(tài)!

首先創(chuàng)建一個控制臺應(yīng)用程序,.NET 4.5,Nuget添加?Microsoft.AspNet.SignalR.SelfHost?Microsoft.Owin.Cors TopShelf(實現(xiàn)windows服務(wù)安裝)

具體新建SignalR SelfHost Server的方法可以看我以前的博客:SignalR SelfHost實時消息,集成到web中,實現(xiàn)服務(wù)器消息推送

新建一個hub命名為ServiceMonitorHub,繼承Microsoft.AspNet.SignalR.Hub,我們要實現(xiàn)服務(wù)狀態(tài)1秒鐘推送一次

具體代碼如下

1 using System.Linq;2 using System.Threading;3 4 namespace wxRbt.Service.Realtime.Hub5 {6 /// <summary>7 /// 服務(wù)監(jiān)控器8 /// </summary>9 public class ServiceMonitorHub:Microsoft.AspNet.SignalR.Hub 10 { 11 static ServiceMonitorHub() 12 { 13 new Thread(new ThreadStart(() => 14 { 15 while (true) 16 { 17 //獲取所有服務(wù)名稱以wxRbt開頭的服務(wù) 18 var services = System.ServiceProcess.ServiceController.GetServices().Where(t => t.ServiceName.StartsWith("wxRbt")) 19 .Select(t => new Model.Service 20 { 21 DisplayName = t.DisplayName, 22 ServiceName = t.ServiceName, 23 Status = (int)t.Status 24 }).ToArray(); 25 Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<ServiceMonitorHub>().Clients.All.refresh(services); 26 //休眠一秒,實現(xiàn)每秒推送服務(wù)運行狀態(tài) 27 System.Threading.Thread.Sleep(1000); 28 } 29 })).Start(); 30 } 31 } 32 }

現(xiàn)在我們再利用TopShelf把當(dāng)前的控制臺安裝成windows服務(wù)

新建一個類ServiceMonitorService,繼承Topshelf.ServiceControl接口,實現(xiàn)其Start跟Stop方法,具體代碼如下

1 using Microsoft.AspNet.SignalR;2 using Microsoft.Owin.Cors;3 using Microsoft.Owin.Hosting;4 using Owin;5 using System;6 using Topshelf;7 using System.Configuration;8 9 namespace wxRbt.Service.Realtime.Service 10 { 11 public class ServiceMonitorService:ServiceControl 12 { 13 private IDisposable app; 14 private static string domain="http://*:3333"; 15 16 static ServiceMonitorService() { 17 domain = ConfigurationManager.AppSettings["Domain"] ?? domain; 18 Console.WriteLine("獲取配置:"+domain); 19 } 20 21 public bool Start(HostControl hostControl) 22 { 23 Console.WriteLine("事實消息服務(wù)運行在:"+domain); 24 25 app = WebApp.Start(domain, builder => 26 { 27 builder.UseCors(CorsOptions.AllowAll); 28 builder.MapSignalR(new HubConfiguration 29 { 30 EnableJSONP = true, 31 EnableDetailedErrors = true, 32 EnableJavaScriptProxies = true 33 }); 34 }); 35 return true; 36 } 37 38 public bool Stop(HostControl hostControl) 39 { 40 if (app != null) { 41 app.Dispose(); 42 } 43 return true; 44 } 45 } 46 }

這里給個默認的監(jiān)聽域名,然后從app.config讀取配置的監(jiān)聽域名

最后打開Progarm.cs文件,代碼如下:

1 using Topshelf;2 3 4 namespace wxRbt.Service.Realtime5 {6 class Program7 {8 static void Main(string[] args)9 { 10 HostFactory.Run(s => { 11 s.Service<Service.ServiceMonitorService>(); 12 s.SetDisplayName("微信實時消息服務(wù)"); 13 s.StartAutomatically(); 14 }); 15 } 16 } 17 }

調(diào)試運行程序,如圖

上面服務(wù)端已經(jīng)完成,下面,我們來實現(xiàn)客戶端:

創(chuàng)建一個MVC4.0web空項目(隨便,個人愛好),Nuget引用Microsoft.AspNet.SignalR.JS,該js依賴jquery,會自動下載jquery,寫TypeScript同學(xué)可以順帶下載這兩個JS的d.ts文件

然后創(chuàng)建一個HomeController,在Index里面返回view即可

Views文件夾創(chuàng)建Home文件夾,創(chuàng)建一個Index.cshtml 的razor試圖,引用jquery跟signalrjs

然后創(chuàng)建一個單獨的JS,盡量不要把js寫到頁面里面去

這里我用TypeScript寫一個消息模塊

1 /// <reference path="../../../scripts/typings/signalr/signalr.d.ts" />2 3 module wxrbt.manager {4 export const enum ServiceStatus {5 /**服務(wù)停止*/6 Stopped = 1,7 /**正在運行*/8 StartPending = 2,9 /**正在停止*/ 10 StopPending = 3, 11 /**運行中*/ 12 Running = 4, 13 /**正在繼續(xù)*/ 14 ContinuePending = 5, 15 /**正在暫停*/ 16 PausePending = 6, 17 /**已暫停*/ 18 Paused = 7, 19 } 20 interface IService { 21 DisplayName: string; 22 ServiceName: string; 23 Status: ServiceStatus 24 } 25 /**管理服務(wù)*/ 26 export class service { 27 private proxy: SignalR.Hub.Proxy; 28 private $: JQueryStatic; 29 private ip: string; 30 private port: number; 31 constructor(ip: string, port: number) { 32 this.ip = ip; 33 this.port = port; 34 } 35 /** 36 * 開啟服務(wù)運行狀態(tài)監(jiān)測 37 * @param {(services} callback 38 */ 39 start(callback: (services: Array<IService>) => void) { 40 jQuery.getScript("http://" + this.ip + ":" + this.port + "/signalr/hubs", () => { 41 jQuery.connection.hub.url = "http://" + this.ip + ":" + this.port + "/signalr"; 42 this.proxy = jQuery.signalR.hub.createHubProxy("ServiceMonitorHub"); 43 44 //每次刷新數(shù)據(jù)回調(diào) 45 this.proxy.on("refresh", (services: Array<IService>) => { 46 callback(services); 47 }); 48 49 50 jQuery.connection.hub.start().fail(() => { 51 alert("連接實時消息服務(wù)期:http://" + this.ip + ":" + this.port + "失敗,請確認消息服務(wù)配置正確且正常開啟!"); 52 }); 53 }); 54 } 55 } 56 }

下面我結(jié)合RequireJs實現(xiàn)的該模塊調(diào)用

1 require(["message"], () => {2 3 jQuery(() => {4 5 var $service = jQuery("#serviceList");6 var msg = new wxrbt.manager.service("127.0.0.1", 3333);7 msg.start(services=>{8 $service.empty();9 for (let service of services) { 10 var isRunning = service.Status == wxrbt.manager.ServiceStatus.Running; 11 var statusCls = isRunning ? "success" : "warning"; 12 var statusTxt = isRunning ? "運行中" : "已停止"; 13 var status = `<label class='label label-${statusCls}'>${statusTxt}</label>`; 14 $service.append(`<li><a href='javascript:;'><i class='icon-check'></i>${service.DisplayName}${status}</a></li><li class="divider"></li>`); 15 } 16 }); 17 18 }); 19 20 21 });

最后運行頁面查看效果:

唯一不足的就是1秒鐘這個dropdownlist會閃動一次,我這里是先清除再append進來,所以會出現(xiàn)這個情況,如果采用dom節(jié)點遞歸更新狀態(tài)就不會有這個問題了!

因為是公司項目,沒辦法上源碼!有不清除的可以留言!

下面是在windows服務(wù)器上跑的服務(wù)截圖

http://www.cnblogs.com/263613093/p/5887636.html

總結(jié)

以上是生活随笔為你收集整理的基于SignalR实现B/S系统对windows服务运行状态的监测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。