将节点模块和 JavaScript 集成到我们的 Web API 控制器调用中

Mat*_*att 1 javascript c# module node.js asp.net-web-api

我们的主要后端服务器是一个 .net 5 Web API 项目。我需要将一些 javascript 模块和 javascript 代码集成到我们的功能中。我想节省将这些模块全部重写为 C# 以便从我们的代码访问的时间。是否有任何包或方法可以完成此任务,或者我最好运行一个单独的节点服务器来实现此功能?

fac*_*ris 8

选项 1. 从 C#/.Net 5 访问 Node.js 服务器脚本

Jering.Javascript.NodeJS使您能够从 C# 调用 Node.js 模块中的 javascript。借助此功能,您可以在 C# 项目中使用 Node.js 脚本/模块。支持:回调、Promise 和异步/等待。通过文件路径、字符串或流获取js脚本。您可以运行保留在内存中的 Node.js 应用程序的单个全局实例,也可以为每个调用创建一个新实例。请参阅从文件调用 Javascript的示例。

通过包管理器或.Net CLI 安装

Install-Package Jering.Javascript.NodeJS
#or
dotnet add package Jering.Javascript.NodeJS
Run Code Online (Sandbox Code Playgroud)

一些模块.js

module.exports = {
    doSomething: (callback, message) => callback(null, { message: message + '!' }),
    doSomethingElse: (callback, message) => callback(null, { message: message + '.' })
}
Run Code Online (Sandbox Code Playgroud)

在您的 .Net 应用程序中

var services = new ServiceCollection();
services.AddNodeJS();
ServiceProvider serviceProvider = services.BuildServiceProvider();
INodeJSService nodeJSService = serviceProvider.GetRequiredService<INodeJSService>();

public class Result {
  public string? Message { get; set; }
}
Result? result = await nodeJSService.InvokeFromFileAsync<Result>("some-module.js", "doSomething", args: new[] { "success" });
Assert.Equal("success!", result?.Message);
Run Code Online (Sandbox Code Playgroud)

这是一个基本的实现示例。您应该查看Jering.Javascript.NodeJS文档以获取安装、配置和使用的完整示例。


选项 2.HTTP REST/Web 套接字

围绕 JS 脚本创建 HTTP Rest 或 WebSocket 包装器,并从 .Net 应用程序调用它们。在您的 .Net 应用程序中,使用HttpClient 类发出 HTTP 请求。然后在 Node.js 中使用路由来包装脚本以访问各种方法。就像是:

const express = require('express');
const app = express();
const port = 3000;

app.get('/some/endpoint', (req, res) => {
  // Gets executed when the URL http://localhost:3000/some/endpoint
  // Do your thing here 
  // Return it back to .Net with:
  res.send(JSON.stringify({some_response: "Hello There"}))
});

// Start the http server
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
});
Run Code Online (Sandbox Code Playgroud)

使用 HTTP Rest/WebSocket 选项将要求您在尝试从 .Net 调用端点之前已经运行 Node.js 应用程序(并保持其运行)。


选项 3. 执行标准 Javascript 嵌入式脚本

以下是最流行的 .Net 模块,它们允许您在 C# .Net 服务中运行标准 Javascript 代码。但是,它们都使用V8 引擎执行 JS 脚本,并且不适用于 Node.js 特定方法(例如 FileSystem)。这些也不允许使用 require() 或 Import。如果您的 Javascript 需求非常有限并且将来不会添加额外的 JS 函数,这可能是一个不错的选择。

  1. 微软ClearScript
  2. 金特
  3. JavaScript.Net

对于非常小的脚本来说,此选项快速且简单,但更新和维护 JS 脚本将是最困难的。