如何在ASPNET JavaScriptServices(Microsoft.AspNetCore.NodeServices)中执行Javascript?

时间:2017-12-15 16:13:52

标签: javascript node.js reactjs asp.net-core-2.0

我正在将ASP.NET Framework 4.6中的应用程序移植到.NET Core 2,并尝试复制Microsoft ClearScript.V8所具有的功能。我寻找NodeJS和ReactJS,但它们似乎有点矫枉过正,并且缺少我正在寻找的功能。我不需要获得渲染结果,但我需要能够注入表示变量的对象,并且更新一个变量的值需要调用后端,以便我可以在数据库中更新它的值。

我还需要能够限制脚本运行的时间。我设置了3秒超时,以便用户无法挂起具有无限循环的线程或运行时间过长的代码。

使用Framework 4.6中的ClearScript.V8,我的代码如下:

using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

using (SmartScript script = new SmartScript())
{
   dynamic addSmartPropertyBool = GetSmartProperty(script._engine, "boolean", true);

   engine.AddHostObject("_ImSmart", script);
   var smartVariableBool = new SmartBoolean(UserId, VariableName, false);
   addSmartPropertyBool(script._engine.Script, VariableName, smartVariableBool);

   script._engine.TimedEvaluate(Constants.DefaultScriptTimeout, someCode);
}

public dynamic GetSmartProperty(ScriptEngine engine, string type, Boolean readOnly)
{
    switch (type)
    {
        case "boolean":
            if (readOnly)
                return engine.Evaluate(@"
                        (function (obj, name, smartBoolean) {
                            Object.defineProperty(obj, name, {
                                enumerable: true,
                                get: function () { return smartBoolean.value; }
                            });
                        })
                    ");
            else
                return engine.Evaluate(@"
                        (function (obj, name, smartBoolean) {
                            Object.defineProperty(obj, name, {
                                enumerable: true,
                                get: function () { return smartBoolean.value; },
                                set: function (value) { smartBoolean.value = value; }
                            });
                        })
                    ");
    }

    return null;
}

public class SmartScript : IDisposable
{
    private Guid _userId;
    public ScriptEngine _engine;

    public SmartScript(Guid userId)
    {
        _userId = userId;
        _engine = new V8ScriptEngine();
    }

    public void Dispose()
    {
        _engine.Dispose();
    }
}

public class SmartBoolean : ISmartVariable
{
    private Guid UserId;
    private string Name;
    public string type
    {
        get {
            return "boolean";
        }
    }
    private Boolean _value;
    public Boolean value
    {
        get {
            return _value;
        }

        set {
            _value = value;

            if (value)
                new SmartCommon().SetTrue(Name);  // Set value in DB
            else
                new SmartCommon().SetFalse(Name);  // Set value in DB
        }
    }

    public SmartBoolean(Guid UserId, string Name, Boolean value)
    {
        this.Name = Name;
        this._value = value;
        this.UserId = UserId;
    }
}

为了简单起见,我留下了一些代码,但我正在寻找以下功能:

  • 在Javascript引擎中注入变量。
  • 在Javascript代码中更新变量将调用后端,以便我可以更新数据库中的值。
  • 能够限制执行运行时间。

如何使用.NET Core 2中的JavascriptServices实现这一目标?或任何其他允许这些功能的引擎。

0 个答案:

没有答案