Я вызываю метод Execute для функции javascript из C# с помощью V8ScriptEngine, но у меня возникла ошибка ReferenceError: XMLHttpRequest не определен. Я установил пакеты nuget, такие как Xhook, но не смог разрешить. Пожалуйста, помогите мне исправить это или предложите способ вызова api из функции javascript и вызвать функцию из C# с помощью ClearScript (v8ScriptEnigne).
Функция 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#: вызов функции javascript из C# с использованием V8ScriptEngine
V8ScriptEngine _v8Engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging);
_v8Engine.Execute(Script_Text);
_v8Engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP");
object returnedVal = _v8Engine.Script.Execute();
return returnedVal;
XMLHttpRequest
является одним из Веб-API, предоставляемых браузерами, тогда как ClearScript и V8 обеспечивают чистую среду JavaScript.
Если вам просто нужен способ вызова HTTP-сервисов, вы можете предоставить что-то вроде System.Net.WebClient
.
Если вам действительно нужен XMLHttpRequest
, у вас есть несколько вариантов. Вы можете раскрыть реализацию Windows COM:
_v8Engine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP");
Или вы можете реализовать его на C# или другом языке .NET и раскрыть его. Одна из таких реализаций - здесь.
Обновлено: рабочий образец с использованием синхронного запроса:
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"));
@rameshsantha Обновите свой вопрос и опубликуйте точный код, который вы используете. В вашем текущем фрагменте JS есть синтаксические ошибки.
Хм, я не могу воспроизвести вашу проблему с ClearScript 5.5.4. Кроме того, похоже, ваш код неправильно использует асинхронный HTTP-запрос. Ваши функции get
и Execute
всегда возвращают undefined
.
Не могли бы вы исправить функции JavaScript для асинхронного вызова HTTP-запроса? Моя функция всегда возвращала неопределенное значение.
Вы не можете использовать асинхронные запросы с простым шаблоном вызова result = SendRequest(...)
, особенно если вы полагаетесь на COM XMLHttpRequest
, который имеет определенные требования к потокам. Я дополню свой ответ рабочим образцом с использованием синхронных запросов.
Я пробовал использовать _v8Engine.AddCOMType ("XMLHttpRequest", "MSXML2.XMLHTTP"), но получил эту ошибку (Ошибка: метод получения свойства недоступен или недоступен) в открытом методе в функции javascript. Является ли функция javascript, которую я написал, правильной ?