2

我正在使用 V8ScriptEngine 从 C# 调用 javascript 函数的 Execute 方法,但出现错误 ReferenceError: XMLHttpRequest is not defined。我安装了像 Xhook 这样的 nuget 包但无法解决。请帮我解决这个问题或建议从 javascript 函数调用 api 的方法并使用 ClearScript(v8ScriptEnigne) 从 c# 调用函数。

Javascript函数:

 function Execute(paraList)
    {
    var finalUrl = "http://172.29.134.69:9006/api/Line/GetStationDefectsByStationId?stationId=1";
    var sol=get(finalUrl,function(){var resp=this.response;return resp;});
    return sol;  
    }
    function get(url, callback) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET",url, true);
        xhr.send("");
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {          
                if (typeof callback === "function") {             
                    callback.apply(xhr);
                }
            }
        };



}

C# 代码:使用 V8ScriptEngine 从 c# 调用 javascript 函数

V8ScriptEngine _v8Engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging);        
    _v8Engine.Execute(Script_Text);       
    _v8Engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP");
    object returnedVal = _v8Engine.Script.Execute();      
    return returnedVal;
4

1 回答 1

2

XMLHttpRequest是浏览器提供的Web API之一,而 ClearScript 和 V8 提供了纯JavaScript环境。

如果您只需要一种调用 HTTP 服务的方法,您可以公开类似System.Net.WebClient.

如果你真的需要XMLHttpRequest,你有几个选择。您可以公开 Windows COM 实现:

_v8Engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP");

或者,您可以用 C# 或其他 .NET 语言实现它并公开它。一个这样的实现是here

编辑:使用同步请求的工作示例:

engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP");
engine.Execute(@"
    function get(url) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, false);
        xhr.send();
        if (xhr.status == 200)
            return xhr.responseText;
        throw new Error('Request failed: ' + xhr.status);
    }
");

Console.WriteLine(engine.Script.get("https://www.google.com"));
于 2018-12-17T16:00:39.657 回答