查看原文
其他

.NET Core中运行JavaScript

DotNet 2019-08-03

(给DotNet加星标,提升.Net技能


转自:晓晨Master

cnblogs.com/stulzq/p/10535310.html


一、前言


在 .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 并捕获输出。


首先,我们将首先创建一个包含返回问候消息的 NodeJs module 的简单JavaScript文件,保存在 scripts/greeter.js文件中:


// greeter.jsmodule.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 生态,创造了更多的可能,大家可以去探索更多的用法。


五、参考资料


本文Demo:https://github.com/stulzq/BlogDemos/tree/master/DotNetCoreUseJs


增加一个组件https://github.com/sebastienros/jint 其也支持 .NET Core 运行 JavaScript,跨平台的。


推荐阅读

(点击标题可跳转阅读)

ASP.NET Core 身份验证及鉴权

.NET Core的全异步模式打造内网穿透工具NSmartProxy

开源组件ExcelReport(为.NET Core而来)使用手册


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

喜欢就点一下「好看」呗~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存