如何用C# Windows Service将客户端COM口风速数据传至远程IIS网页表单
解决方案步骤
1. 部署Windows Service(每台Win11设备单独运行)
- 把你现有WinForms里的COM口读取逻辑移植到Windows Service中,Service后台运行无需UI,直接处理风速数据即可。
- 给每台设备分配唯一设备ID(可写在配置文件里,或读取硬件序列号生成),用来区分不同设备的数据。
- 实现数据上传逻辑:用
HttpClient把风速数据+设备ID以POST请求发送到ASP.NET后端API,示例代码片段:
// 从配置文件读取设备唯一标识 string deviceId = ConfigurationManager.AppSettings["DeviceId"]; using HttpClient client = new HttpClient(); var uploadData = new { DeviceId = deviceId, WindSpeed = currentWindSpeedValue }; await client.PostAsJsonAsync("http://你的IIS服务器域名/api/WindSpeed/Upload", uploadData);
- 设置Service为自动启动,确保设备开机后自动运行采集上传任务。
2. 编写ASP.NET后端API
- 新建
WindSpeedController控制器,实现数据接收接口:
[HttpPost("Upload")] public IActionResult ReceiveWindSpeed([FromBody] WindSpeedDto data) { // 用设备ID作为键存储数据:短期用内存缓存,长期用数据库 MemoryCache.Default.Set(data.DeviceId, data.WindSpeed, TimeSpan.FromMinutes(10)); return Ok(); } // 定义数据传输模型 public class WindSpeedDto { public string DeviceId { get; set; } public decimal WindSpeed { get; set; } }
- 再实现指定设备的数据获取接口:
[HttpGet("Get/{deviceId}")] public IActionResult GetDeviceWindSpeed(string deviceId) { if (MemoryCache.Default.TryGetValue(deviceId, out decimal speed)) { return Ok(new { WindSpeed = speed }); } return NotFound("暂无数据"); }
3. 前端网页实现专属数据展示
- 网页添加文本框,通过JS定时拉取对应设备的风速数据。设备ID可通过URL参数(如
http://你的网页地址?deviceId=dev001)或用户绑定的方式传递:
<input type="text" id="windSpeedBox" readonly> <script> // 从URL参数提取当前设备ID const urlParams = new URLSearchParams(window.location.search); const targetDeviceId = urlParams.get('deviceId'); // 每2秒拉取一次数据 setInterval(async () => { const res = await fetch(`/api/WindSpeed/Get/${targetDeviceId}`); if (res.ok) { const data = await res.json(); document.getElementById('windSpeedBox').value = `${data.WindSpeed} m/s`; } }, 2000); </script>
- 确保每个访问网页的设备/用户携带专属deviceId,这样只会拉取自身设备的数据,不会出现串显示问题。
4. 核心注意事项
- 设备ID必须全局唯一,避免不同设备数据互相覆盖。
- Windows Service中要处理网络异常,添加重试机制,防止临时断网导致数据丢失。
- 若需长期存储数据,用SQL Server等数据库替代内存缓存(内存缓存会在服务器重启后清空)。
- 可给API添加密钥验证,防止非法数据上传或获取。
内容的提问来源于stack exchange,提问作者HoOb CoMpUtEr
相关产品推荐
相关产品推荐

