在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,一经查实,立即删除!

相关文章

第十七周周报-王雲慧

一、Mybatis和JS (一) Mybatis 拦截器 ​ 类似于 Servlet 开发中的过滤器 Filter&#xff0c;用于对处理器进行预处理和后处理 自定义拦截器步骤&#xff1a; ​ 实现接口HandlerInterceptor—>配置拦截器&#xff08;实现WebMvcConfigurer 接口重写addInterceptors注册拦截…

基于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;验证用&…

Unity优化——脚本优化策略3

大家好&#xff0c;这里是七七&#xff0c;今天又来更新Unity脚本优化篇了&#xff0c;话不多说&#xff0c;直接上主题。 一、注意缓存Transform的变化 Transform组件只存储与其父组件相关的数据。这意味着访问和修改Transform组件的position、rotation和scale属性会导致大量…

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

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

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

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

小内存服务器生存指南 ——SWAP 虚拟内存

人们常说,网络是服务器的生命线,没有了网络,服务器再怎么牛逼,都跑不起来。然而偏偏有这么一票的服务器,它的网络很好,CPU 也很好,就是内存有点小。他们是主机界的独行侠 —— 入门级 VPS 服务器。 前俩天买的一台 TMT 的服务器就是这个类型: 256M 内存CPU 1vCore (2.…

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

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

业务编码生成规则

在开发中&#xff0c;咱们有很多时候需要自定义编码&#xff0c;而不是使用uuid或者是自增ID。 本章就介绍一个自定义业务编码的生成规则。 import lombok.AllArgsConstructor; import lombok.Getter;/*** author: mcs* Date: 2022/11/27 10:00* Description: 业务编码类型及其…

力扣labuladong——一刷day53

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣1485. 克隆含随机指针的二叉树二、力扣1490. 克隆 N 叉树三、力扣133. 克隆图四、力扣138. 随机链表的复制 前言 复制带有随机指针的二叉树或者链表&am…

Java 文件常用操作与流转换

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

正向代理和反向代理

正向代理和反向代理是常用的代理方式。 正向代理是代理服务器为客户端&#xff08;如浏览器&#xff09;提供服务。一般来说&#xff0c;客户端发起请求&#xff0c;请求会被代理服务器所截获&#xff0c;代理服务器向目标服务器发送请求&#xff0c;目标服务器将响应发送给代…

Java基础之注解

Java基础之注解 一、Java注解1.1、内置注解1.2、元注解1.3、自定义注解 一、Java注解 注解&#xff08;Annotation&#xff09;是一种为程序代码提供元数据&#xff08;metadata&#xff09;的方式。注解提供了关于程序代码的额外信息&#xff0c;这些信息可以在运行时或编译时…

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

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

GPS北斗对时服务(时间同步系统)电力变电站应用方案

GPS北斗对时服务&#xff08;时间同步系统&#xff09;电力变电站应用方案 GPS北斗对时服务&#xff08;时间同步系统&#xff09;电力变电站应用方案 1.概述 在现代电网中&#xff0c;统一的时间系统对于电力系统的故障分析、监视控制及运行管理具有重要意义。变电站的对时是指…

GEE——利用Landsat C02 T1_L2数据进行某研究区的长时序(1985-2023年)NDVI和FVC计算

本教程的主要目的是在2022年底GEE已经不提供LandsatC01数据,所以这里给大家提供数据质量更高的C02数据集,这样我们就可以更快的切换过来。本教程主要目的就是实现NDVI和FVC长时序的计算,从而看某个区域的时空变化特特征。 数据介绍 Landsat C02 T1_L2数据是Landsat 8卫星(…

内网隧道学习

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

数据结构 / 结构体指针

1. 格式 struct 结构体名{数据类型 成员1;数据类型 成员2; .... };struct 结构体名 *指针变量名 2. 结构体指针指向普通变量的地址 struct CAR{char name[10];int price; };struct CAR car{"byd",160}; struct CAR *p&car; //p是指向结构体变量car的指针// p…