我正在将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;
}
}
为了简单起见,我留下了一些代码,但我正在寻找以下功能:
如何使用.NET Core 2中的JavascriptServices实现这一目标?或任何其他允许这些功能的引擎。