chrome собственные сообщения, хост зависает при попытке отправить сообщение в браузер - PullRequest
0 голосов
/ 26 февраля 2020

При попытке отправить ответ в браузер через собственный обмен сообщениями с Xamarin из macOS, для приложения macOS зависает хост.

Я предположил, что способ обработки отправки сообщения был неправильным, но неспособность к отладке делает вещи близкими к невозможному.

Чтобы быть в состоянии подтвердить, что мой хост хорошо анализирует полученное сообщение, я вставил «Console.WriteLine», который выходит из хоста с ошибки передаются на печать Console.Error.

Но если я удалю строку кода «Console.WriteLine», ошибок и возможности «отладки» не будет.

Вот мой код:

        public void Listen()
    {
        //if (!IsRegisteredWithChrome()) throw new NotRegisteredWithChromeException(Hostname);
        JObject data;

        while ((data = Read()) != null)
        {

            var message = ProcessReceivedMessageAsync(data);

            SendMessage(message);
        }

    }

    private JObject Read()
    {

        Stream stdin = Console.OpenStandardInput();

        byte[] lengthBytes = new byte[4];
        stdin.Read(lengthBytes, 0, lengthBytes.Length);

        char[] buffer = new char[BitConverter.ToInt32(lengthBytes, 0)];


        var reader = new StreamReader(stdin);
        //int messageLength =

        reader.Read(buffer, 0, buffer.Length);


        //TextWriter errorWriter = Console.Error;
        //errorWriter.WriteLine("\n\n\n\nMessage Length -> {0}\n\n\n\n", messageLength);

        //**Console.WriteLine("Only to raise error for; host to exit, and errorWriter to print data");**
        while (reader.Peek() >= 0) reader.Read(buffer, 0, buffer.Length);

        return JsonConvert.DeserializeObject<JObject>(new string(buffer));

    }


    public void SendMessage(JToken data)
    {



        try
        {

            var bytes = Encoding.UTF8.GetBytes(data.ToString(Formatting.None));
            var lengthBytes = BitConverter.GetBytes(bytes.Length);
            var stdout = Console.OpenStandardOutput();


            //Array.Reverse(bytes);
            //Array.Reverse(lengthBytes);
            stdout.Write(lengthBytes, 0, 4);
            stdout.Write(bytes, 0, bytes.Length);
            stdout.Flush();




            // Tried the most common usage below, to no avail.
            //var json = new JObject();
            //json["data"] = data;

            //var bytes = Encoding.UTF8.GetBytes(json.ToString(Formatting.None));

            //var stdout = Console.OpenStandardOutput();
            //stdout.WriteByte((byte)((bytes.Length >> 0) & 0xFF));
            //stdout.WriteByte((byte)((bytes.Length >> 8) & 0xFF));
            //stdout.WriteByte((byte)((bytes.Length >> 16) & 0xFF));
            //stdout.WriteByte((byte)((bytes.Length >> 24) & 0xFF));
            //stdout.Write(bytes, 0, bytes.Length);
            //stdout.Flush();

        }
        catch(Exception)
        {
            //TextWriter errorWriter = Console.Error;
            //Console.WriteLine("\n\n\n\nWrite exception -> {0}", e);
        }

Как вы можете видеть в моем методе SendMessage, я пытался обратить вспять массивы на случай, если причиной был порядок байтов, но Console.WriteLine, похоже, отправляет данные в stdout, что приводит к выходу хоста. Это заставляет меня думать, что мой способ записи в stdout неправильный (порядковый номер или необходимость заменить запись stdout).

Я также подумал, что мой метод чтения не будет читать до конца, но это наиболее скорее всего, расширение браузера не получает ответа, по моему мнению.

Нужно ли делать что-то кроме печати ответа на стороне браузера?

Спасибо.

...