如何创建系统磁盘详情监控服务?求实现步骤与代码指导
磁盘监控系统完整实现方案
一、需求概述
- 开发Windows服务,通过RestSharp每5分钟调用ASP.NET Core Web API,收集并发送当前系统的主机名、用户名、磁盘名称、磁盘可用空间、磁盘总空间信息
- Web API接收数据并存储到数据库
- 前端门户通过Dapper从数据库读取数据,支持管理员按主机名和用户名筛选查看磁盘数量及可用空间
二、Windows Service 完整实现
现有代码是控制台程序,需改造为可长期运行的Windows服务,并实现定时任务逻辑。以下采用.NET Core Worker Service方案(支持跨平台,可注册为Windows服务):
2.1 项目初始化
- 新建.NET Core Worker Service项目(命名为
DriveMonitorService) - 安装NuGet包:
RestSharp:用于HTTP请求Microsoft.Extensions.Hosting.WindowsServices:将Worker注册为Windows服务
2.2 完整代码实现
Worker.cs(核心逻辑)
using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using RestSharp; namespace DriveMonitorService { public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly TimeSpan _interval = TimeSpan.FromMinutes(5); // 5分钟执行一次 public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { await SendDriveInfoAsync(); _logger.LogInformation("磁盘信息已成功发送,下次执行时间:{NextRunTime}", DateTime.Now.Add(_interval)); } catch (Exception ex) { _logger.LogError(ex, "发送磁盘信息时出错"); } await Task.Delay(_interval, stoppingToken); } } private async Task SendDriveInfoAsync() { DriveInfo[] drives = DriveInfo.GetDrives(); var client = new RestClient("http://your-api-url/api/drives"); // 替换为实际API地址 foreach (DriveInfo drive in drives) { if (drive.IsReady) { var request = new RestRequest(Method.POST); request.AddJsonBody(new { SystemName = Environment.MachineName, UserName = Environment.UserName, DriveName = drive.Name, FreeSpace = drive.TotalFreeSpace, TotalSpace = drive.TotalSize, CollectionTime = DateTime.Now }); var response = await client.ExecuteAsync(request); if (!response.IsSuccessful) { _logger.LogWarning("发送磁盘{DriveName}信息失败,状态码:{StatusCode}", drive.Name, response.StatusCode); } } } } } }
Program.cs(注册为Windows服务)
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace DriveMonitorService { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() // 启用Windows服务支持 .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); } }
2.3 服务安装
- 发布项目为自包含部署包(或框架依赖)
- 以管理员身份打开命令提示符,执行以下命令:
卸载服务:sc create DriveMonitorService binPath="C:\Path\To\Your\Published\DriveMonitorService.exe" sc start DriveMonitorServicesc delete DriveMonitorService
三、ASP.NET Core Web API 实现
3.1 项目初始化
- 新建ASP.NET Core Web API项目(命名为
DriveMonitorAPI) - 安装NuGet包:
Dapper:用于数据库操作Microsoft.Data.SqlClient:SQL Server驱动Microsoft.AspNetCore.Mvc.NewtonsoftJson:支持JSON序列化
3.2 数据模型与数据库表
数据库表创建SQL(SQL Server)
CREATE TABLE DriveRecords ( Id INT IDENTITY(1,1) PRIMARY KEY, SystemName NVARCHAR(100) NOT NULL, UserName NVARCHAR(100) NOT NULL, DriveName NVARCHAR(20) NOT NULL, FreeSpace BIGINT NOT NULL, TotalSpace BIGINT NOT NULL, CollectionTime DATETIME NOT NULL )
模型类(DriveRecord.cs)
namespace DriveMonitorAPI.Models { public class DriveRecord { public int Id { get; set; } public string SystemName { get; set; } public string UserName { get; set; } public string DriveName { get; set; } public long FreeSpace { get; set; } public long TotalSpace { get; set; } public DateTime CollectionTime { get; set; } } }
3.3 API控制器实现
DrivesController.cs
using Dapper; using DriveMonitorAPI.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using System.Data; namespace DriveMonitorAPI.Controllers { [Route("api/[controller]")] [ApiController] public class DrivesController : ControllerBase { private readonly string _connectionString; public DrivesController(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } [HttpPost] public async Task<IActionResult> PostDriveRecord([FromBody] DriveRecord record) { if (!ModelState.IsValid) { return BadRequest(ModelState); } using IDbConnection db = new SqlConnection(_connectionString); string sql = @"INSERT INTO DriveRecords (SystemName, UserName, DriveName, FreeSpace, TotalSpace, CollectionTime) VALUES (@SystemName, @UserName, @DriveName, @FreeSpace, @TotalSpace, @CollectionTime)"; int affectedRows = await db.ExecuteAsync(sql, record); return affectedRows > 0 ? Ok() : StatusCode(500, "存储数据失败"); } } }
3.4 配置连接字符串
在appsettings.json中添加数据库连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=your-server;Database=DriveMonitorDB;Trusted_Connection=True;TrustServerCertificate=True;" } }
四、前端门户实现(ASP.NET Core MVC)
4.1 项目初始化
- 新建ASP.NET Core MVC项目(命名为
DriveMonitorPortal) - 安装NuGet包:
Dapper、Microsoft.Data.SqlClient
4.2 数据查询与控制器
HomeController.cs
using Dapper; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using System.Data; namespace DriveMonitorPortal.Controllers { public class HomeController : Controller { private readonly string _connectionString; public HomeController(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public IActionResult Index(string systemName = "", string userName = "") { using IDbConnection db = new SqlConnection(_connectionString); string sql = @"SELECT SystemName, UserName, DriveName, FreeSpace, TotalSpace, CollectionTime FROM DriveRecords WHERE (@SystemName = '' OR SystemName LIKE '%' + @SystemName + '%') AND (@UserName = '' OR UserName LIKE '%' + @UserName + '%') ORDER BY CollectionTime DESC"; var records = db.Query(sql, new { SystemName = systemName, UserName = userName }).ToList(); return View(records); } } }
4.3 视图实现(Index.cshtml)
@{ ViewData["Title"] = "磁盘监控门户"; } <h1>磁盘监控数据</h1> <form asp-action="Index" method="get"> <div class="form-group"> <label>主机名:</label> <input type="text" name="systemName" value="@Request.Query["systemName"]" class="form-control" /> </div> <div class="form-group"> <label>用户名:</label> <input type="text" name="userName" value="@Request.Query["userName"]" class="form-control" /> </div> <button type="submit" class="btn btn-primary">查询</button> </form> <table class="table mt-4"> <thead> <tr> <th>主机名</th> <th>用户名</th> <th>磁盘名称</th> <th>可用空间(GB)</th> <th>总空间(GB)</th> <th>收集时间</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.SystemName</td> <td>@item.UserName</td> <td>@item.DriveName</td> <td>@Math.Round((double)item.FreeSpace / 1024 / 1024 / 1024, 2)</td> <td>@Math.Round((double)item.TotalSpace / 1024 / 1024 / 1024, 2)</td> <td>@item.CollectionTime.ToString("yyyy-MM-dd HH:mm:ss")</td> </tr> } </tbody> </table>
4.4 配置连接字符串
同样在appsettings.json中添加与API相同的数据库连接字符串。
五、部署与验证
- 部署Web API到服务器,确保API地址可被目标Windows服务访问
- 部署前端门户到服务器,测试查询功能
- 在目标机器安装并启动Windows服务,查看数据库是否有数据写入
- 通过前端门户验证数据展示与筛选功能
内容的提问来源于stack exchange,提问作者Mina
相关产品推荐
相关产品推荐

