在 .NET Framework 时,咱们能够经过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,咱们如何在 .NET Core 中运行 JavaScript 呢,答案是使用 NodeServices。关于为什么有在 .NET Core 中执行 JavaScript 这种需求,比较特殊,举个栗子:当你作模拟登陆时,目标网站可能采用一些加密算法来计算特殊的值,若是你要彻底模拟,那么除了用C#翻译这个算法还有个办法就是直接将这段加密算法JS代码拷贝使用C#来执行。还举个栗子:SPA服务端渲染,好比Angular、 React等。javascript
NodeServices 是一个 ASP.NET Core 中间件,将它添加到 ASP.NET Core 管道中,该中间件调用Node在运行时执行JavaScript。 这意味着若是使用 NodeServices,你必须在主机上安装Node。java
NodeServices 的开源地址为:https://github.com/aspnet/JavaScriptServicesnode
在 Nuget 发布的包名为:Microsoft.AspNetCore.NodeServices
git
1.新建一个 ASP.NET Core 2.2 应用程序github
2.而后经过Nuget安装包 Microsoft.AspNetCore.NodeServices
(v2.2.0)算法
3.在Startup.cs文件的ConfigureServices方法中引用它api
public void ConfigureServices(IServiceCollection services) { services.AddNodeServices(); }
如今,咱们能够使用接口INodeServices
来调用Js代码,它的源码以下:async
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); }
基本用法ide
如今咱们已经安装了 NodeServicess,让咱们看一下简单的用例,而后介绍如何在应用程序中执行一些简单的JavaScript 并捕获输出。测试
首先,咱们将首先建立一个包含返回问候消息的 NodeJs 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 接入 NodeJs 生态,创造了更多的可能,你们能够去探索更多的用法。
Using Node Services in ASP.NET Core by dotnetthoughts
Executing JavaScript inside of .NET Core using JavaScriptServices by josephwoodward
本文Demo: DotNetCoreUseJs
增长一个组件 https://github.com/sebastienros/jint 其也支持 .NET Core 运行 JavaScript,跨平台的。