Собственный обмен сообщениями от расширения Chrome до собственного хоста, написанного на C#

Я пытаюсь получить сообщение от моего расширения Chrome через собственный обмен сообщениями. popup.html console указывает, что сообщение отправляется, но мой хост по какой-то причине не получает его. Я вижу, что хозяин native.exe запускается в диспетчере задач, но хост не получает отправленные данные.

popup.js

document.addEventListener('DOMContentLoaded', function() {
    var downloadButton= document.getElementById('Button');
    downloadButton.addEventListener('click', function () {
        chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
            chrome.tabs.executeScript(tabs[0].id, {file: "myScript.js"}, function (data) {
                sendNativeMessage(data[0]);
            });
        });
    });
});

function sendNativeMessage(msg) {
    var hostName = "com.google.example";

    console.log("Connecting to host: " + hostName);
    port = chrome.runtime.connectNative(hostName);

    message = {"text": msg};
    port.postMessage(message);

    console.log("Sent message: " + JSON.stringify(message));
}

Теперь, когда я отправляю сообщение с моего расширения Chrome, я вижу журнал консоли для popup.html и сообщение верное.

Я пытался протестировать все, используя некоторый код, который, как утверждают, работал, из Native Messaging Chrome. Конкретно у меня есть

native.exe

    static void Main(string[] args) {
        while (OpenStandardStreamIn() != null || OpenStandardStreamIn() != "")
        {
            Console.WriteLine(OpenStandardStreamIn());
        }
    }

    private static string OpenStandardStreamIn()
    {
        //Read first four bytes for length information
        System.IO.Stream stdin = Console.OpenStandardInput();
        int length = 0;
        byte[] bytes = new byte[4];
        stdin.Read(bytes, 0, 4);
        length = System.BitConverter.ToInt32(bytes, 0);

        string input = "";
        for (int i = 0; i < length; i++)
            input += (char)stdin.ReadByte();

        return input;
    }

Я все еще пытаюсь обернуть голову вокруг nativeMessaging, но так как я вижу сообщение, отправляемое через журналы консоли, я должен предположить, что ошибка связана с моим .exe, Я создал ключи реестра HKCU и создал хост manifest.json файл. Поскольку расширение запускает .exe Я уверен, что все это работает нормально.

Если бы кто-то мог оказать некоторую помощь в этом, это было бы очень ценно. Спасибо!


РЕДАКТИРОВАТЬ: После абсолютно ничего не меняю, я не могу получить native.exe запустить больше из моего расширения. Чтобы исправить это, я попытался переписать отправителя, чтобы не открывать порт:

...
chrome.tabs.executeScript(tabs[0].id, {file: "myScript.js"}, function (data) {
    chrome.runtime.sendNativeMessage('com.google.example', {"text":data[0]}, function(response) {
        if (chrome.runtime.lastError)
            console.log("ERROR");
        } else {
            console.log("Response: " + response);
        }
    });
});
...

Это тоже не работает вообще. Понятия не имею, что я делаю не так или почему мой хозяин .exe прекратил запуск, когда я отправил сообщение со своего внутреннего номера.


РЕДАКТИРОВАТЬ № 2

Хорошие новости!

Я удалил свой раздел реестра и затем добавил его снова, на этот раз в реестр локального компьютера (т.е. HKLM). Я снова использовал код из Native Messaging Chrome для отправки и получения с моего хоста. Теперь, когда я просматриваю журнал моего расширения, я вижу правильный ответ от моего хоста. Я использую метод "без порта", просто вызывая chrome.runtime.sendNativeMessage(...), что хорошо для моих целей. К сожалению, я не получаю сообщение ОТ расширения ДО хоста. Также мой host.exe никогда не завершается, даже после получения сообщения. Я не уверен, почему, но если кто-то может помочь, я был бы признателен.

На моем хосте я пытаюсь записать входящее сообщение в файл, чтобы проверить, что получаю сообщение:

System.IO.File.WriteAllText(@"path_to_file.txt", OpenStandardStreamIn());

Примечание. Сообщение, которое я передаю ОТ расширения ДО хоста, составляет около 250 КБ (оно варьируется от сообщения к сообщению).

Проблема в:

  1. Ничего не записано в файл. Это абсолютно пусто.
  2. Создание файла занимает много времени (~4 секунды).
  3. мой host.exe Экземпляр никогда не заканчивается. Это все еще работает (я могу видеть это в диспетчере задач).

1 ответ

Решение

Чтобы заставить работать мое расширение, я выполнил следующие шаги:

  1. Я удалил свой раздел реестра, а затем снова добавил его в мой реестр HKLM.
  2. Хотя это и не нужно,host.exe на самом деле нужно было только получить одно сообщение от расширения, поэтому я изменил свой предыдущий обмен сообщениями "открытый порт" на сообщение "нет порта", т.е.

    chrome.runtime.sendNativeMessage(...);

  3. Что важно, когда я изменил текст, который я отправлял с {"text":data[0]} в простую строку {"text":"Hello from Chrome!"}все стало работать без сбоев. data[0] была строка размером около 250 КБ, что определенно должно быть приемлемого размера сообщения в соответствии с сайтом разработчика. Однако я создал другой вопрос для этой проблемы, поскольку мне удалось решить общую проблему отправки и получения сообщений, с которой я столкнулся.

Другие вопросы по тегам