You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建系统磁盘详情监控服务?求实现步骤与代码指导

磁盘监控系统完整实现方案

一、需求概述

  • 开发Windows服务,通过RestSharp每5分钟调用ASP.NET Core Web API,收集并发送当前系统的主机名、用户名、磁盘名称、磁盘可用空间、磁盘总空间信息
  • Web API接收数据并存储到数据库
  • 前端门户通过Dapper从数据库读取数据,支持管理员按主机名和用户名筛选查看磁盘数量及可用空间

二、Windows Service 完整实现

现有代码是控制台程序,需改造为可长期运行的Windows服务,并实现定时任务逻辑。以下采用.NET Core Worker Service方案(支持跨平台,可注册为Windows服务):

2.1 项目初始化

  1. 新建.NET Core Worker Service项目(命名为DriveMonitorService)
  2. 安装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 服务安装

  1. 发布项目为自包含部署包(或框架依赖)
  2. 以管理员身份打开命令提示符,执行以下命令:
    sc create DriveMonitorService binPath="C:\Path\To\Your\Published\DriveMonitorService.exe"
    sc start DriveMonitorService
    
    卸载服务:sc delete DriveMonitorService

三、ASP.NET Core Web API 实现

3.1 项目初始化

  1. 新建ASP.NET Core Web API项目(命名为DriveMonitorAPI)
  2. 安装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 项目初始化

  1. 新建ASP.NET Core MVC项目(命名为DriveMonitorPortal)
  2. 安装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相同的数据库连接字符串。

五、部署与验证

  1. 部署Web API到服务器,确保API地址可被目标Windows服务访问
  2. 部署前端门户到服务器,测试查询功能
  3. 在目标机器安装并启动Windows服务,查看数据库是否有数据写入
  4. 通过前端门户验证数据展示与筛选功能

内容的提问来源于stack exchange,提问作者Mina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:40:38