如何通过Node.js访问运行中C#可执行程序的数据?
问题解决:Node.js与本地C#程序的HTTP数据交互
核心问题定位
你之前的http.request代码存在两个致命错误,导致请求未正常发送:
req.end是函数,必须加括号调用req.end(),否则请求不会被提交- 模板字符串用了单引号,
'STATUS:${res.statusCode}'无法解析变量,需改成反引号
修复后的原生http模块代码
先确保导入http模块,再完善请求逻辑(包含数据接收、错误处理):
const http = require('http'); // 必须先导入http模块 function getTestData02B(callback) { const req = http.request('http://192.168.1.222/ListAlarms.html', (res) => { let responseData = ''; // 分段接收响应数据 res.on('data', (chunk) => { responseData += chunk; }); // 响应接收完成,返回数据 res.on('end', () => { console.log(`STATUS: ${res.statusCode}`); callback(null, responseData); }); }); // 监听请求错误(比如连接失败、超时) req.on('error', (err) => { console.error('调用C#服务出错:', err); callback(err, null); }); // 必须调用end()发送请求 req.end(); }
更简洁的替代方案:用axios简化请求
原生http模块写法繁琐,推荐用axios库,处理异步和错误更直观:
- 安装axios:
npm install axios
- 修改homeController.js中的
getTest02B方法:
const axios = require('axios'); exports.getTest02B = async (req, res) => { console.log("in exports.getTest02B"); displayInformation(req.url, "URL"); displayInformation(req.method, "METHOD"); displayEmptyLine(); try { // 直接发起GET请求 const response = await axios.get('http://192.168.1.222/ListAlarms.html'); console.log(`STATUS: ${response.status}`); // 将C#返回的数据转发给前端 res.send(response.data); } catch (error) { console.error('请求C#服务失败:', error.message); // 返回错误信息给前端 res.status(500).send(`获取数据失败: ${error.message}`); } };
额外排查点
如果修复后仍无响应,检查以下内容:
- 确认C#程序的HTTP服务是否绑定了0.0.0.0或局域网IP,而非仅
localhost(若Node.js和C#在同一机器,可尝试用http://localhost:端口/ListAlarms.html) - 检查系统防火墙是否拦截了Node.js对C#服务端口的请求
- 确认C#服务是否需要特定请求头(比如
Content-Type),浏览器自动携带的头Node.js可能未添加,可通过请求配置补充(axios可通过headers参数添加) - 查看C#程序的调试日志,确认是否收到Node.js的请求,以及返回的状态码和内容
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

