【问题标题】:ReferenceError:XMLHttpRequest is not defined while using ClearScript(V8ScriptEngine)ReferenceError:使用 ClearScript(V8ScriptEngine) 时未定义 XMLHttpRequest
【发布时间】:2018-12-17 06:42:40
【问题描述】:

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

【问题讨论】:

    标签: javascript c# clearscript


    【解决方案1】:

    XMLHttpRequest 是浏览器提供的Web APIs 之一,而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"));
    

    【讨论】:

    • 我尝试使用 _v8Engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP") 但在 javascript 函数的 open 方法中出现此错误(错误:属性获取方法不可用或不可访问)。是我写的javascript函数正确吗?
    • @rameshsantha 更新您的问题并发布您正在运行的确切代码。你当前的 JS sn-p 有语法错误。
    • 嗯,我无法使用 ClearScript 5.5.4 重现您的问题。除此之外,您的代码似乎错误地使用了异步 HTTP 请求。你的getExecute 函数总是返回undefined
    • 能否更正 JavaScript 函数以异步调用 Http 请求?我的函数总是返回未定义的值。
    • 您不能使用具有简单result = SendRequest(...) 调用模式的异步请求,尤其是在依赖具有特定线程要求的COM XMLHttpRequest 时。我将使用同步请求的工作示例更新我的答案。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2019-03-24
    • 2012-08-24
    • 2017-10-11
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多