在NAS上部署.NET版本的WOL远程开机服务

在本文中,我们将以部署基于.NET的WOL远程开机服务为例,详细介绍如何利用Docker技术在群辉部署ASP.NET服务。同时,我们还将展示如何对原有的控制台WOL进行改造,以及如何使用SignAuthorization简易URL验签类库。文章相关的代码开源地址:https://github.com/sangyuxiaowu/WakeOnLan?wt.mc_id=DT-MVP-5005195

文章目录

  • 1. 背景
  • 2. 准备工作
  • 2.1 创建 WebAPI 服务
  • 2.2 迁移原有代码
  • 2.3 加入 URL 验签
  • 3. 在NAS部署
    • 3.1 Docker 镜像打包
    • 3.2 导出与导入
  • 4. 测试与使用
    • 4.1 测试
    • 4.2 部署
    • 4.3 使用
  • 5. 总结

1. 背景

在之前的文章《使用.NET实现WOL唤醒远程开机》中,我们已经成功实现了一个基于.NET的控制台程序,用于控制设备的远程唤醒功能。然而,为了实现远程控制访问,我们需要将这个控制台程序转换为WebAPI形式,并进行相应的部署。

通过本篇文章你会了解到:

  • APS.NET 项目的容器化
  • Docker 镜像的导出
  • 群辉 Docker 的使用
  • 远程网络唤醒服务的部署
  • SignAuthorization 简易URL验签类库的使用

2. 准备工作

在开始部署之前,请确保您已经拥有一台支持Docker的群辉NAS设备。当然,您也可以选择其他方式部署ASP.NET服务。

2.1 创建 WebAPI 服务

首先,我们需要创建一个WebAPI服务。在本教程中,我们将使用minAPI来实现轻量级的API,并启用Docker容器化支持。启用后,会在项目目录自动生成 `Dockerfile`` 文件。

请添加图片描述

2.2 迁移原有代码

接下来,我们需要将原有的控制台程序中的WOL唤醒功能代码迁移到新创建的WebAPI服务中。

这里我们单独写一个 WOL 的类来处理网络唤醒包数据的发送实现:

using System.Net.Sockets;
using System.Net;namespace WakeOnLan
{internal class WOL{internal static void Send(string macAddress){byte[] magicPacket = CreateMagicPacket(macAddress);SendMagicPacket(magicPacket);}static byte[] CreateMagicPacket(string macAddress){byte[] macBytes = ParseMacAddress(macAddress);byte[] magicPacket = new byte[6 + (6 * 16)];for (int i = 0; i < 6; i++){magicPacket[i] = 0xFF;}for (int i = 6; i < magicPacket.Length; i += 6){Array.Copy(macBytes, 0, magicPacket, i, 6);}return magicPacket;}static byte[] ParseMacAddress(string macAddress){string cleanedMacAddress = macAddress.Replace(":", "").Replace("-", "");if (cleanedMacAddress.Length != 12){throw new ArgumentException("Invalid MAC address format");}byte[] macBytes = new byte[6];for (int i = 0; i < 6; i++){macBytes[i] = Convert.ToByte(cleanedMacAddress.Substring(i * 2, 2), 16);}return macBytes;}static void SendMagicPacket(byte[] magicPacket){using (UdpClient udpClient = new UdpClient()){udpClient.Connect(IPAddress.Broadcast, 9);udpClient.Send(magicPacket, magicPacket.Length);}}}
}

另外增加一个帮助类,用于 MAC 地址检查和设备是否在线的 Ping 测试:

internal class Helper
{internal static bool IsValidMacAddress(string macAddress){Regex regex = new Regex("^([0-9a-fA-F]{2}[:-]?){5}([0-9a-fA-F]{2})$");return regex.IsMatch(macAddress);}internal static bool Ping(string iP){// 检查IP是否在线Ping ping = new Ping();PingReply pingReply = ping.Send(iP,100);return pingReply.Status == IPStatus.Success;}
}

2.3 加入 URL 验签

为了确保WebAPI服务的访问安全,我们将加入简易且安全的SignAuthorization URL验签机制。

可以通过 Nuget 管理工具搜索或者执行直接命令安装:

Install-Package Sang.AspNetCore.SignAuthorization

请添加图片描述

安装完成后,需要在 Program.cs 进行简单的配置,从 appsettings.json 读取配置的 token 即可。

app.UseSignAuthorization(opt => {// 从配置文件读取 Tokenopt.sToken = app.Configuration["Token"];
});

引入 SignAuthorization 后进行简单的声明就可以让接口必须进行 URL 验签才可以访问,这里为了方便调试,只在生产环境起效,添加了 SignAuthorizeAttribute,比如下面的唤醒接口:

app.MapGet("/wol", (string mac) =>
{if (!Helper.IsValidMacAddress(mac)){return new CallBack(false, 400, "MAC地址格式错误");}WOL.Send(mac);return new CallBack(true, 200, "发送成功");
})
#if DEBUG
.WithOpenApi(operation => new(operation)
{Summary = "执行网络唤醒",Description = "通过传入MAC地址唤醒局域网内的设备"
})
#else
.WithMetadata(new SignAuthorizeAttribute())
#endif
;

最后添加一个从配置文件展示设备列表的接口,整体的迁移工作就可以完事了:

app.MapGet("/devices", () =>
{// 从配置文件读取设备列表var devices = app.Configuration.GetSection("Devices").Get<List<Device>>();// 判断IP是否在线Parallel.ForEach(devices, (device) =>{device.Online = Helper.Ping(device.IP);});return new CallBack<List<Device>>(true, 200, "获取成功", devices);
})
#if DEBUG
.WithOpenApi(operation => new(operation)
{Summary = "获取设备配置列表",Description = "获取配置的设备信息"
})
#else
.WithMetadata(new SignAuthorizeAttribute())
#endif
;

3. 在NAS部署

3.1 Docker 镜像打包

在部署前,我们需要先进行镜像制备,这里我们有两种主要方法可以选择。首先,可以在云端创建镜像,然后通过群辉的Docker管理后台通过 URL 方式添加。此外,另一种更常用的方法是在本地进行镜像制备。在这种情况下,我们同样有两种途径可供选择。

请添加图片描述

第一种方案是通过SSH登录群辉,直接执行Docker构建。为了实现这个目的,需要将项目文件拷贝到NAS上,然后在项目目录中执行相应的构建命令。这种方法的优点是可以直接在NAS上完成构建过程,从而节省了将镜像从本地上传到NAS的时间。

不过,这种方式需要在管理后台开启SSH,为了安全起见这个功能一般是不建议开启的。开开关关的折腾也挺不方便的。

一般的做法是在本地,如通过 wsl 打包 Docker 镜像(可以使用 Docker Desktop 或),然后导出镜像文件,最后通过群辉的管理后台上传镜像文件。

无论哪种方式制备镜像,我们只需要进入项目目录,执行打包命令:

docker build -t wol -f Dockerfile ..

请添加图片描述

注意: 这里的 Dockerfile 需要根据项目的情况修改默认的模板,可以查看今天推送的另一篇文章。

3.2 导出与导入

如果你没有使用 NAS 上的 Docker 进行打包,则需要导出,可以通过下面的指令:

docker save -o wol.tar wol

特别注意,这里会导出 wol:latest,不要通过查询 Image ID 的方式传参,这样导入的镜像会失去原有的 name 和 tag 。这种情况在群辉管理后台是无法显示这样的镜像的。

执行导出后,我们会得到一个 wol.tar 文件。在群辉管理后台上传即可。

请添加图片描述

4. 测试与使用

4.1 测试

如果使用 wsl 生成,我们直接启动镜像即可测试:

docker run -d -p 8080:8080 --name wol-1 wol

以上指令仅用于测试服务能否访问,无法实际使用

4.2 部署

在群辉的管理后台,我们也可以直接创建容器。需要特别注意的是,因为项目的特殊性,这里需要使用宿主机的本地网络,这样才可以发送唤醒包。

请添加图片描述

如果你有修改默认端口的需求,则需要通过修改环境变量 ASPNETCORE_HTTP_PORTS

请添加图片描述

对于设备列表的修改,则需要通过修改 appsettings.json 配置文件,这里除了在制备 Docker 镜像前修改外也可以通过进入容器内部或是在管理后台映射配置文件到 NAS 存储上。

请添加图片描述

4.3 使用

正式环境中 SignAuthorization 的配置是生效的,我们需要通过 URL 签名的方式访问服务的API。服务对外提供的是API调用,所以我们一般需要通过编程的方式来调用。签名方法可以查看 SignAuthorization 项目的介绍。同时,也可以关注后续项目增加的简易 Web 页面。

5. 总结

本文详细介绍了如何将基于.NET的WOL远程开机服务控制台程序迁移到minAPI创建的WebAPI服务中,并使用群辉的Docker技术进行部署。此外,我们还介绍了如何加入简易且安全的SignAuthorization URL验签机制,以确保远程访问的安全性。希望本文能为您提供实际操作的指导和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm的网上订餐系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7 | mysql | maven | tomcat 二、代码与数据库 三、功能介绍 01. web端-首页 02. web端-我的餐车 03. web端-我的订单 04. web端-用户中心 05. web…

ubuntu22.04 git 安装

安装git&#xff1a;默认情况下&#xff0c;Git 在 ubuntu 22.04 基础存储库中可用。 现在运行以下命令在您的 Ubuntu 系统上安装最新版本的 Git&#xff1a; 查看当前版本号 git --version

初识前后端数据交互(新手篇)

一个软件项目的开发必然是离不开前端和后端的协作&#xff0c;对于刚入行的新手前端或者新手后端来说&#xff0c;很有必要了解一下对方是在做什么&#xff0c;以及提供给自己什么样的帮助&#xff0c;为什么需要对方共同协作才能完成整个软件项目的开发呢&#xff1f;希望这篇…

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字&#xff1a; raster、point、PostGIS、等值线 环境准备 Postgresql版本&#xff1a;PostgreSQL 14.0, 64-bitPostGIS版本&#xff1a;POSTGIS"3.3.2"QGIS版本&#xff1a;3.28.3-Firenze&#xff08;验证用&…

浅谈安科瑞ASJ继电器在马尔代夫环岛水上排屋的应用

摘要&#xff1a;对电气线路进行接地故障保护&#xff0c;方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点&#xff0c;设计安装剩余电流继电器&#xff0c;实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…

长期用台灯影响视力吗?备考专用护眼台灯推荐

大家都知道台灯作为一种小范围的桌面照明灯具&#xff0c;在夜晚能给我们带来很大的帮助&#xff0c;不管是办公、还是学习、阅读都需要它提供照明。那么长期使用台灯会影响视力吗&#xff1f;其实台灯一般都眼睛都是没有伤害的&#xff0c;真正对眼睛有伤害的是不正确的使用台…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口&#xff0c;其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框&#xff0c;第二个按钮点击时会执行一个特定的操作&#xff08;在这个例子中&#xff0c;仅打印一条调试信息&#xff09;。 功能描述&#xff1a; 创建窗口和布局&#xff1a;…

Java 文件常用操作与流转换

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言 当我们重新部署前端项目的时候&#xff0c;如果用户一直停留在页面上并未刷新使用&#xff0c;会存在功能使用差异性的问题&#xff0c;因此&#xff0c;当前端部署项目后&#xff0c;需要提醒用户有去重新加载页面。 技术框架 vue、js、webpack 解决方案 编译项目时动…

内网隧道学习

默认密码&#xff1a;hongrisec2019 一.环境搭建 网卡学习 一个网卡一个分段&#xff0c;想象成一个管道 192.168.52一段 192.168.150一段 仅主机模式保证不予外界连通&#xff0c;保证恶意操作不会跑到真实机之上 52段是内部通信&#xff0c;150段属于服务器&#xff08;…

PC8231(CC/CV)5V/2.4A同步降压芯片 频率可调 限流欠压补偿

一&#xff0e;概述 PC8231 是一款同步降压转换器&#xff0c; 该转换器可驱动输出 2.4A 负载电流。 设计允许 PC8231 在 9V 到40V 宽输入电压范围内工作。通过将 COMP/EN 引脚逻辑电平拉低来实现外部关断功能&#xff0c;并进入待机模式。外部补偿使反馈控制环路具有良好的线…

CRM的智能招投标对企业有什么意义?

如今CRM系统的生态系统越来越壮大&#xff0c;这些工具的集成极大地丰富了CRM系统的应用场景&#xff0c;例如CRM系统集成企业微信等社交媒体为获客提供便利&#xff1b;再比如CRM集成ChatGPT提高邮件内容质量&#xff0c;对于经常接触招投标项目的业务人员来说&#xff0c;在C…

英特尔工作站:助力专业用户实现高效创作

原创 | 文 BFT机器人 英特尔工作站是由全球知名的英特尔公司设计和开发的一款计算平台。英特尔在工作站处理器领域将其产品分为性能型和移动型两类&#xff0c;它的诞生旨在满足专业用户在科学、工程、设计等领域对高性能计算的需求。英特尔工作站配备了最新的英特尔处理器、大…

EI期刊论文复现:考虑电动汽车可调度潜力的充电站两阶段市场投标策略程序代码!

本程序代码参考EI期刊论文《考虑电动汽车可调度潜力的充电站两阶段市场投标策略》&#xff0c;程序中基于历史数据评估可调度潜力&#xff0c;由联合报价模型确定节点边际电价&#xff0c;作为报价的参考&#xff0c;包含个体竞价模式&#xff0c;纳什博弈竞价&#xff0c;算例…

docker (简介、dcoker详细安装步骤)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

Git远程仓库常用开发命令和理解

远程仓库 创建与合并分支 每次提交&#xff0c;Git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。截止到目前&#xff0c;只有一条时间线&#xff0c;在Git里&#xff0c;这个分支叫主分支&#xff0c;即master分支。 HEAD严格来说不是指向提交&#xff0c;而…

01.vue3大事件——项目初始化、技术介绍

后台数据管理系统 - 项目架构设计 在线演示&#xff1a;https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项…

工作流能实现自动化吗?应该用什么工具?

研究显示&#xff0c;CRM系统工作流自动化软件不仅能简化冗余的工作且不需要监控和指导就能提高员工的工作效率。企业需要工作流自动化软件吗&#xff1f;答案是肯定的&#xff0c;工作流自动化的好处有哪些&#xff1f; 为什么企业需要工作流自动化软件 每家企业都希望降本增…

企业营销管理能够实现自动化吗?怎么做?

当今企业面临着越来越多的营销难题&#xff1a;如何有效培育潜在客户、如何提高营销活动的效果、如何优化营销资源的分配......企业的营销管理怎么做&#xff1f;或许CRM系统营销自动化会起到作用。 客户细分&#xff1a; 企业可以通过CRM的客户细分功能&#xff0c;根据客户…

内衣洗衣机和手洗哪个干净?最好用的迷你洗衣机

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…