Очень медленно для передачи «большого» объема данных из расширения Chrome на хост (написанный на C #)
Я использую ChromeNative Messaging API передать DOM страницы моему хосту. Когда я пытаюсь передать небольшую строку из моего расширения на мой хост, все работает, но когда я пытаюсь передать весь DOM (который не такой большой ... всего около 260 КБ), все работает намного медленнее, и я в итоге получаюNative host has exited error
предотвращение ответа хоста.
Мой главный вопрос: почему так долго передается сообщение 250KB - 350KB с внутреннего номера на хост?
Согласносайт разработчика:
Chrome запускает каждый собственный узел обмена сообщениями в отдельном процессе и связывается с ним, используя стандартный ввод (stdin) и стандартный вывод (stdout). Один и тот же формат используется для отправки сообщений в обоих направлениях: каждое сообщение сериализуется с использованием JSON, кодировки UTF-8 и ему предшествует 32-битная длина сообщения в собственном байтовом порядке. Максимальный размер отдельного сообщения от собственного узла обмена сообщениями составляет 1 МБ, в основном для защиты Chrome от неправильной работы собственных приложений.Максимальный размер сообщения, отправляемого на собственный узел обмена сообщениями, составляет 4 ГБ.
Страницы, DOM которых я заинтересован в отправке на мой хост, имеют размер не более 260 КБ (а иногда и 300 КБ), что значительно ниже установленного максимума в 4 ГБ.
popup.js
document.addEventListener('DOMContentLoaded', function() {
var downloadButton = document.getElementById('download_button');
downloadButton.addEventListener('click', function() {
chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
chrome.tabs.executeScript(tabs[0].id, {file: "getDOM.js"}, function (data) {
chrome.runtime.sendNativeMessage('com.google.example', {"text":data[0]}, function (response) {
if (chrome.runtime.lastError) {
console.log("Error: " + chrome.runtime.lastError.message);
} else {
console.log("Response: " + response);
}
});
});
});
});
});
host.exe
private static string StandardOutputStreamIn() {
Stream stdin = new Console.OpenStandardInput();
int length = 0;
byte[] bytes = new byte[4];
stdin.Read(bytes, 0, 4);
length = System.BitConverter.ToInt32(bytes, 0);
string = "";
for (int i=0; i < length; i++)
string += (char)stdin.ReadByte();
return string;
}
Обратите внимание, я нашел вышеупомянутый метод изэтот вопрос.
На данный момент я просто пытаюсь записать строку в файл .txt:
public void Main(String[] args) {
string msg = OpenStandardStreamIn();
System.IO.File.WriteAllText(@"path_to_file.txt", msg);
}
Запись строки в файл занимает много времени (~ 4 секунды, а иногда и до 10 секунд).Объем фактически написанного текста варьируется, но это не более, чем просто объявление верхнего документа и несколько тегов комментариев IE. Весь текст теперь появляется.Этот файл с почти любым текстом имеет размер 649 КБ, но сам документ должен иметь размер всего 205 КБ (когда я его скачиваю). Файл по-прежнему немного больше, чем должен быть (216 КБ, когда он должен быть 205 КБ).Я проверил мойgetDOM.js
Функция, просто загрузив файл, и весь процесс почти мгновенно.
Я не уверен, почему этот процесс занимает так много времени, почему файл настолько велик или почему фактически отправляется только какое-либо сообщение.
Я не уверен, что это как-то связано с десериализацией сообщения определенным образом, если я должен создать порт вместо использованияchrome.runtime.sendNativeMessage(...);
метод, или если есть что-то еще, что я пропускаю.
Вся помощь очень ценится! Спасибо!
РЕДАКТИРОВАТЬ
Хотя мое сообщение правильно отправлено ОТ расширения к хосту, сейчас я получаюNative host has exited error
до того, как добавочный номер получит сообщение хоста.