一. 前言
在 .NET Framework 时, 我们可以通过 V8.NET 等组件来运行 JavaScript, 不过目前我看了好几个开源组件包括 V8.NET 都还不支持 .NET Core , 我们如何在 .NET Core 中运行 JavaScript 呢, 答案是使用 NodeServices. 关于为何有在 .NET Core 中执行 JavaScript 这种需求, 比较特殊, 举个栗子: 当你做模拟登录时, 目标网站可能采用一些加密算法来计算特殊的值, 如果你要完全模拟, 那么除了用 C# 翻译这个算法还有个办法就是直接将这段加密算法 JS 代码拷贝使用 C# 来执行. 还举个栗子: SPA 服务端渲染, 比如 Angular, React 等.
二. 什么是 NodeServices
NodeServices 是一个 ASP.NET Core 中间件, 将它添加到 ASP.NET Core 管道中, 该中间件调用 Node 在运行时执行 JavaScript. 这意味着如果使用 NodeServices, 你必须在主机上安装 Node.
三. 使用 NodeServices
NodeServices 的开源地址为: https://github.com/aspnet/JavaScriptServices
在 Nuget 发布的包名为: Microsoft.AspNetCore.NodeServices
1. 新建一个 ASP.NET Core 2.2 应用程序
2. 然后通过 Nuget 安装包 Microsoft.AspNetCore.NodeServices(v2.2.0)
3. 在 Startup.cs 文件的 ConfigureServices 方法中引用它
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddNodeServices();
- }
现在, 我们可以使用接口 INodeServices 来调用 JS 代码, 它的源码如下:
- public interface INodeServices : IDisposable
- {
- Task<T> InvokeAsync<T>(string moduleName, params object[] args);
- Task<T> InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args);
- Task<T> InvokeExportAsync<T>(string moduleName, string exportedFunctionName, params object[] args);
- Task<T> InvokeExportAsync<T>(CancellationToken cancellationToken, string moduleName, string exportedFunctionName, params object[] args);
- }
基本用法
现在我们已经安装了 NodeServicess, 让我们看一下简单的用例, 然后介绍如何在应用程序中执行一些简单的 JavaScript 并捕获输出.
首先, 我们将首先创建一个包含返回问候消息的 Node.JS module 的简单 JavaScript 文件, 保存在 scripts/greeter.JS 文件中:
- // greeter.JS
- module.exports = function (callback, name) {
- var greet = function (name) {
- return "Hello" + name;
- }
- callback(null, greet(name));
- }
接下来, 我们将 INodeServices 的一个实例注入到我们的控制器中, 并通过调用 InvokeAsync<T > 方法来调用我们的 JS 代码, 其中 T 是我们 JS 代码的返回类型 (在这个实例中是一个 string).
- [Route("api/[controller]")]
- [ApiController]
- public class ValuesController : ControllerBase
- {
- private readonly INodeServices _services;
- public ValuesController(INodeServices services)
- {
- _services = services;
- }
- // GET API/values
- [HttpGet]
- public async Task<string> Get()
- {
- string greetingMessage = await _services.InvokeAsync<string>("./scripts/greeter", "晓晨");
- return greetingMessage;
- }
- }
运行测试:
四. 结束
NodeServices 可以使 .NET Core 接入 Node.JS 生态, 创造了更多的可能, 大家可以去探索更多的用法.
五. 参考资料
- Using Node Services in ASP.NET Core by dotnetthoughts
- Executing JavaScript inside of .NET Core using JavaScriptServices by josephwoodward
本文 Demo:
来源: https://www.cnblogs.com/stulzq/p/10535310.html