连接Node.js与.NET Core服务端引擎、实现JS调用C#接口的最优方案?
最优实现方案:ASP.NET Core + SignalR
这个方案完全规避你自己实现MQ服务时要处理的指令封装、返回值路由、多客户端管理等复杂逻辑,原生支持RPC风格的函数调用,自动处理参数/返回值序列化,且完美适配树莓派ARM运行环境。
- 核心优势:无需修改你已有的
IWorkbench实现逻辑,只需新增薄服务层对外暴露接口,JS客户端调用方法和调用本地函数体验一致 - 类型适配:C#的
byte[]类型会自动和JS侧的Uint8Array互转,无需额外做编码转换
C#服务端实现步骤
- 给你现有管理GPIO的C#项目添加ASP.NET Core 宿主支持,注入你已经写好的
IWorkbench实现类到依赖注入容器 - 新增SignalR Hub类,直接对接
IWorkbench的方法:
using Microsoft.AspNetCore.SignalR; public class WorkbenchHub : Hub { private readonly IWorkbench _workbench; // 直接注入已实现的IWorkbench实例 public WorkbenchHub(IWorkbench workbench) { _workbench = workbench; } public Task SetDigitalOutput(byte[] output) { _workbench.SetDigitalOutput(output); return Task.CompletedTask; } public Task<byte[]> GetDigitalInput() { return Task.FromResult(_workbench.GetDigitalInput()); } public Task<double> GetTemperatureBySensor() { return Task.FromResult(_workbench.GetTemperatureBySensor()); } }
- 在启动配置中注册SignalR服务、配置跨域规则(允许远程JS客户端访问)、映射Hub路由即可,整体代码改动量不超过30行。
JS客户端实现步骤
直接使用官方SignalR JS SDK,连接后直接调用对应方法即可:
// 引入SDK,也可以直接用UMD格式的本地包 import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr'; // 初始化连接 const connection = new HubConnectionBuilder() .withUrl('http://<树莓派IP:开放端口>/workbenchHub') .configureLogging(LogLevel.Warning) .build(); // 启动连接 await connection.start(); // 直接调用远端方法,原生支持返回值接收 const currentTemp = await connection.invoke('GetTemperatureBySensor'); console.log('读取到的温度值:', currentTemp); const inputPorts = await connection.invoke('GetDigitalInput'); console.log('数字输入端口状态:', inputPorts); // 写入数字输出 await connection.invoke('SetDigitalOutput', new Uint8Array([0x01, 0x03, 0x05]));
备选轻量方案:REST API
如果你不想引入SignalR依赖,可以直接用ASP.NET Core Web API暴露接口,实现起来同样比自建MQ简单:
- C#侧新增API Controller,注入
IWorkbench,分别给三个方法写POST/GET接口,byte[]参数会自动和Base64字符串互转 - JS侧直接用
fetch调用接口即可,无需额外安装依赖,适合调用频率不高的场景
内容的提问来源于stack exchange,提问作者Marco Arigliani
相关产品推荐
相关产品推荐

