【问题标题】:Can a C# application communicate with Node.js code?C# 应用程序可以与 Node.js 代码通信吗?
【发布时间】:2013-02-14 17:27:43
【问题描述】:

我有一个 C# 应用程序和一个 Node.js 应用程序。我想在我的 C# 应用程序中按下一个按钮,将三个参数作为输入发送到 Node.js 应用程序/函数。这可能吗?

编辑:两个应用程序在同一台机器上运行。 C# 应用程序将为 Node.js 应用程序提供三个参数。 Node.js 应用程序将查询 Web 服务 (POST)、接收一些 XML 数据并操作该数据。我知道我也可以在 C# 中完成这项任务,但在这种情况下,它必须是 Node.js。

编辑 #2 和解决方案:现在我选择了:4. Your node process runs a socket server and your C# app does requests over tcp

我还将提供一个似乎可行的解决方案:

现在您可以将任何数据从 C# 应用程序发送到 Node.js 服务器了。

【问题讨论】:

  • 这确实应该是可能的。如果你有一个具体的问题,如果你尝试去做,然后问一个关于你尝试的具体问题,那就太好了。
  • 你的 node.js 应用如何监听请求?您在侦听 HTTP 或 TCP 请求吗?它是您将从 C# 应用程序启动的命令行应用程序吗?
  • @HectorCorrea 我还没有开始使用 node.js。我想确保沟通是可行的。 node.js 应用程序应该一直运行并准备好从 c# 应用程序获取一些输入。
  • 应用程序是否在同一台机器上运行?如果是,您想研究进程间通信 (IPC)。有许多 IPC 方法(管道、文件、套接字...),正确的选择取决于您的具体要求。对于 node.js IPC,请参见 stackoverflow.com/questions/6463945/…
  • 你可以看看这个模块。它可能不完全符合您的需求,但仍然很酷。 Edge.js > 在进程中运行 .NET 和 node.js 代码

标签: c# node.js


【解决方案1】:

是的,就像几个人在您的问题的 cmets 中指出的那样,可以进行交流。

这些是(一些)选项:

  1. 您的节点进程运行一个 http 服务器,而您的 C# 应用通过 http 执行 JSON Rest 请求
  2. 您的节点进程使用 node-soap/strong-soap 模块运行 SOAP Web 服务
  3. C# 应用程序启动您的节点应用程序,您通过写入节点进程输入流并读取它的输出流来执行 IPC。
  4. 您的节点进程运行一个套接字服务器,并且您的 C# 应用程序通过 tcp 发出请求。
  5. 您使用第三个进程/服务器,例如 Redis 或消息队列
  6. 任何可以让您共享文件等数据的东西..

我建议您选择第一个选项,因为它不需要您定义语言协议以通过“线路”发送。另一个原因是有很多关于使用 C# 和 node.js 进行 Rest 的文档。

作为 C# 中的客户端库,如果您不能使用最新版本的 .NET (4.5),我建议您查看 Restsharp 作为客户端库。如果您可以使用最新版本,请使用 HttpClient 调用您的 Node.js restservice。 对于 Node,只需使用 Express。

选项 2 可能很快,因为 VS 对 web 服务有很好的支持,但是,我只使用 node-soap 作为客户端,所以无法评论 node-soap webservices 与 C# 客户端的效果。

【讨论】:

  • 添加了 node-soap 作为选项
  • 您可以使用任何形式的 IPC 在两个进程之间进行连接,无论是 nodejs 应用程序还是您的 C# 应用程序,也可以是任何此类场景。你也可以看看tjanczuk.github.io/edge/#
  • 在 C# 中是否也可以只使用 process.start 并执行 Node 语句?(例如 node start_test.js)这是个好主意吗?
【解决方案2】:

手动处理进程间通信非常耗时,而且旧的替代方法是 Edge.js,has not been updated since mid 2017

我的组织维护了一个库 Jering.Javascript.NodeJS,它允许您从 C# 调用 Node.js。

示例用法

string javascriptModule = @"
module.exports = (callback, x, y) => {  // Module must export a function that takes a callback as its first parameter
    var result = x + y; // Your javascript logic
    callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}";

// Invoke javascript in Node.js
int result = await StaticNodeJSService.InvokeFromStringAsync<int>(javascriptModule, args: new object[] { 3, 5 });

// result == 8
Assert.Equal(8, result);

您可以调用任何有效的 Node.js 模块,包括执行问题中列出的任务的模块:查询 Web 服务 (POST)、接收 XML 数据和操作该数据。

亮点

  • 跨平台支持

    • 面向 .NET Standard 2.0 和 .NET Framework 4.6.1。
    • 在 Windows、macOS 和 Linux 上测试。
  • Performance 功能

    • 不会为每次调用启动新的 Node.js 进程。相反,通过进程间通信将调用发送到长期存在的进程。
    • (可选)在 Node.js 进程集群中运行调用 concurrently。处理集群的负载平衡。
    • 尽可能缓存已编译的 javascript。
  • 长时间运行的应用程序支持

    • 如果 Node.js 进程意外终止,则重新启动它们。
    • (可选)在文件更改时重新启动 Node.js 进程。
    • 当父 .Net 进程死亡时杀死 Node.js 进程。
  • Flexible API

    • 同时公开static API 和基于依赖注入的API。
    • 支持以string 形式、Stream 形式或从磁盘上的文件调用javascript。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2017-03-02
相关资源
最近更新 更多