1. 程式人生 > >基於SignalR實現B/S系統對windows服務執行狀態的監測

基於SignalR實現B/S系統對windows服務執行狀態的監測

通常來講一個BS專案肯定不止單獨的一個BS應用,可能涉及到很多後臺服務來支援BS的執行,特別是針對耗時較長的某些任務來說,Windows服務肯定是必不可少的,我們還需要利用B/S與windows服務進行互動,來實現更好的使用者體驗,搭配redis,memcached等來實現分散式快取,訊息列隊處理等等。。。

但是通常情況我們在B/S端是無法得知其依賴的windows服務當前處於什麼樣的執行狀態,只能通過到server裡面去進行檢視,或者通過其他途徑!

今天我們就通過SignalR來實現一個B/S端對windows服務執行狀態的監控,這裡我們用SignalR selfHost,不依賴IIS,然後利用topshelf把SignalR Server部署成windows服務,然後在B/S端通過SignalR js client進行連接獲取服務執行狀態!

首先建立一個控制檯應用程式,.NET 4.5,Nuget新增 Microsoft.AspNet.SignalR.SelfHost Microsoft.Owin.Cors TopShelf(實現windows服務安裝)

新建一個hub命名為ServiceMonitorHub,繼承Microsoft.AspNet.SignalR.Hub,我們要實現服務狀態1秒鐘推送一次

具體程式碼如下

複製程式碼
 1 using System.Linq;
 2 using System.Threading;
 3 
 4 namespace wxRbt.Service.Realtime.Hub
 5 {
 6
/// <summary> 7 /// 服務監控器 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 //獲取所有服務名稱以wxRbt開頭的服務 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 //休眠一秒,實現每秒推送服務執行狀態 27 System.Threading.Thread.Sleep(1000); 28 } 29 })).Start(); 30 } 31 } 32 }
複製程式碼

現在我們再利用TopShelf把當前的控制檯安裝成windows服務

新建一個類ServiceMonitorService,繼承Topshelf.ServiceControl介面,實現其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("事實訊息服務執行在:"+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 }
複製程式碼

這裡給個預設的監聽域名,然後從app.config讀取配置的監聽域名

最後開啟Progarm.cs檔案,程式碼如下:

複製程式碼
 1 using Topshelf;
 2 
 3 
 4 namespace wxRbt.Service.Realtime
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             HostFactory.Run(s => {
11                 s.Service<Service.ServiceMonitorService>();
12                 s.SetDisplayName("微信實時訊息服務");
13                 s.StartAutomatically();
14             });
15         }
16     }
17 }
複製程式碼

除錯執行程式,如圖

上面服務端已經完成,下面,我們來實現客戶端:

建立一個MVC4.0web空專案(隨便,個人愛好),Nuget引用Microsoft.AspNet.SignalR.JS,該js依賴jquery,會自動下載jquery,寫TypeScript同學可以順帶下載這兩個JS的d.ts檔案

然後建立一個HomeController,在Index裡面返回view即可

Views資料夾建立Home資料夾,建立一個Index.cshtml 的razor試圖,引用jquery跟signalrjs

然後建立一個單獨的JS,儘量不要把js寫到頁面裡面去

這裡我用TypeScript寫一個訊息模組

複製程式碼
 1 /// <reference path="../../../scripts/typings/signalr/signalr.d.ts" />
 2 
 3 module wxrbt.manager {
 4     export const enum ServiceStatus {
 5         /**服務停止*/
 6         Stopped = 1,
 7         /**正在執行*/
 8         StartPending = 2,
 9         /**正在停止*/
10         StopPending = 3,
11         /**執行中*/
12         Running = 4,
13         /**正在繼續*/
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     /**管理服務*/
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          * 開啟服務執行狀態監測
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                 //每次重新整理資料回撥
45                 this.proxy.on("refresh", (services: Array<IService>) => {
46                     callback(services);
47                 });
48 
49 
50                 jQuery.connection.hub.start().fail(() => {
51                     alert("連線實時訊息服務期:http://" + this.ip + ":" + this.port + "失敗,請確認訊息服務配置正確且正常開啟!");
52                 });
53             });
54         }
55     }
56 }
複製程式碼

下面我結合RequireJs實現的該模組呼叫

複製程式碼
 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進來,所以會出現這個情況,如果採用dom節點遞迴更新狀態就不會有這個問題了!

因為是公司專案,沒辦法上原始碼!有不清除的可以留言!

下面是在windows伺服器上跑的服務截圖

相關推薦

基於SignalR實現B/S系統windows服務執行狀態監測

通常來講一個BS專案肯定不止單獨的一個BS應用,可能涉及到很多後臺服務來支援BS的執行,特別是針對耗時較長的某些任務來說,Windows服務肯定是必不可少的,我們還需要利用B/S與windows服務進行互動,來實現更好的使用者體驗,搭配redis,memcached等來實

JAVA B/S系統實現客戶端螢幕截圖,Java版的QQ截圖

簡介:本方法首先需要抓到螢幕的整個圖象,將圖象顯示在一個JFrame中,再將JFrame全屏顯示,這樣就模擬出了一個桌面,Java也就可以獲得滑鼠的作用區域從而實現桌面中的小範圍截圖。Java實現QQ螢幕截圖功能(跨平臺螢幕截圖功能,支援windows,OSX,Linux...) 程式目錄結構如下:

B/S系統登入記住密碼的實現

用Js實現B/S系統登入時記住密碼的功能分為兩步:     1.第一次登入時如果選中記住密碼,將使用者名稱和密碼儲存到cookie中去。      2.登入時獲取cookie中的使用者名稱和密碼設定給登入介面上的使用者名稱和密碼,如果cookie中沒有則不存在儲存的密碼。

ArcGIS 實現B/S業務開發平臺搭建

ArcGIS 實現B/S業務開發平臺搭建 一、架構圖     參考: 理解arcgis server 10.1及其架構    https://blog.csdn.net/wiiwei/article/details/46430067二

基於cobbler實現自動安裝系統

說明:安裝cobbler、dhcp、tftp的虛擬機器兩塊網絡卡eth0:10.220.5.117(橋接)用於連線xshell,eth1:192.168.100.86(vmnet3)作為自動安裝系統的伺服器使用。 一、安裝配置cobbler 二、安裝配置dhc

B/S系統MVC與三層結構詳解

我們平時總是將三層架構與MVC混為一談,殊不知它倆並不是一個概念。 下面我來為大家揭曉我所知道的一些真相。 首先,它倆根本不是一個概念。 三層架構是一個分層式的軟體體系架構設計,它可適用於任何一個專案。 MVC是一個設計模式,它是根據專案的具體需求來決定是否適

C/SB/S系統測試的不同點和相同點

C/S 應用中經常用到的測試方法:下面的應用功能測試客戶端應用被獨立地執行,以揭示在其執行中的錯誤。1  伺服器測試        測試伺服器的協調和資料管理功能,也考慮伺服器效能(整體反映時間和資料吞吐量)。2 資料庫測試       測試伺服器儲存的資料的精確性和完整性,檢查客戶端應用提交的事務,以保證資

基於SSH實現員工管理系統登入許可權的過濾器與攔截器的綜合使用

需要實現的功能:判斷使用者是否已登入,未登入使用者禁止訪問任何頁面或action,自動跳轉到登入頁面。 過程很艱辛,雖然是挺簡單的應用,但是自己也弄了好久才有些許弄明白,結合網上搜索到的內容寫下這篇總結,待日後可回頭檢視。 剛開始是先搜了攔截器如何攔截未登入

C#基於Quartz.NET實現任務排程並部署Windows服務

一、Quartz.NET介紹 Quartz.NET是一個強大、開源、輕量的作業排程框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改寫,可用於winform和asp.net mvc、.Net Core應用中。它靈活而不復雜。你能夠用它來為執行一個作業而建立簡單的或複雜的作業

Zabbix 添加Windows CPU占用監測

zabbix這次來添加對Windows CPU占用率的監測,不需要在客戶端操作配置-主機-監控項-添加監控項鍵值:perf_counter["\Processor(_Total)\% User Time"]其他的如圖設置接著添加圖形保存,稍等即可看到圖形---END---參考:http:/

C#或 VB.NET通過 ServiceController 程式碼控制Windows服務安裝解除安裝過程出錯,windows服務程式檔案佔用,無法釋放資源問題

一、VS報的錯誤 二、程式碼 三、錯誤分析 1.首先,這個錯誤是因為檔案許可權問題引起的,筆者系統為WIN10,VS2017。筆者在給要控制安裝啟動的windows服務程式資料夾新增上“Everyone”許可權後,是可以正常通過程式碼正常控制windows服務的安裝、

PythonWindows服務進行監控

#-*- encoding: utf-8 -*- import logging import wmi import os import time from ConfigParser import ConfigParser import smtplib fro

關於B/S模式的web服務互動過程中的中文亂碼問題淺析

Web服務是服務端和瀏覽器之間的互動,兩者之間因為中文編碼的問題很容易導致亂碼出現。 站在服務端(servlet)角度,亂碼分成兩種接收請求(request)和響應瀏覽器(response)。 有關亂碼的問題主要是下圖中的四個元件之間的引起的。 (1)request請求產

java如何監控系統程序和服務狀態

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Shell實現Docker環境準備和應用服務執行

考慮問題 還是根據之前的Shell編寫經驗,本文需要注意幾個問題: Docker 的容器IP獲取 如何進入MySQL容器執行資料庫指令碼 Docker應用映象的匯入匯出 Shell 指令碼sed -i 修改XML引數空格問題導致引數個數解析多於預期 如何設計

Redis作為多個Windows服務執行配置方法

http://www.it165.net/admin/html/201407/3407.html 1.首先下載微軟官方推薦的版本redis-2.8.12 2.開始配置,首先複製兩份redis.conf並且重新命名為redis6379.conf  redis6380

AndroidApp前後臺執行狀態的判斷

在某些特定場景下,我們需要判斷App是否處於後臺執行狀態,常見如:推送或聊天訊息是否需要顯示到通知欄中、設定手勢密碼狀態下應用是否顯示解鎖介面等。 Android系統中判斷App的前後臺執行狀態,大家常用的就是ActivityManager這個類,獲取RunningAppProcessI

基於C#的WEB伺服器執行狀態監測程式

每天監測網站是否正常執行,之前是一個一個開啟,現在寫一個程式來監測。 步驟1.將檔案配成XML格式方便讀寫,相對於資料庫來說已操作。 XmlDocument dom = new XmlDocument(); dom.Load(

[原始碼和文件分享]基於JSP和SQL SERVER實現B/S架構的超市管理系統

1.2 技術方案 開發和管理一個基於B/S模式的管理資訊系統需要開發和利用高效率的網路資源,並且應該充分利用高技術含量的技術。本系統開發中使用了Java Server Pages和Java Bean。為了能將Java Server Pages、Java Bean以及Java Servlets三種

Python tkinter 實現簡單登陸註冊 基於B/S三層體系結構,實現用戶身份驗證

cte cursor 實現簡單 結果 pass 分享圖片 not null for 技術 Python tkinter 實現簡單登陸註冊 最終效果 開始界面 ? 註冊 登陸 ? 源碼 login.py # encoding=utf-8 f