基於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/S與B/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服務的安裝、
Python對Windows服務進行監控
#-*- 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
Android對App前後臺執行狀態的判斷
在某些特定場景下,我們需要判斷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