美文网首页
(转载)在 .NET Core 中运行 JavaScript

(转载)在 .NET Core 中运行 JavaScript

作者: AI视客 | 来源:发表于2019-03-20 14:05 被阅读0次

    文章转载自:https://www.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.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;
        }
    }
    

    运行测试:

    1552615237181

    相关文章

      网友评论

          本文标题:(转载)在 .NET Core 中运行 JavaScript

          本文链接:https://www.haomeiwen.com/subject/ftvzmqtx.html