При попытке отправить ответ в браузер через собственный обмен сообщениями с 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).
Я также подумал, что мой метод чтения не будет читать до конца, но это наиболее скорее всего, расширение браузера не получает ответа, по моему мнению.
Нужно ли делать что-то кроме печати ответа на стороне браузера?
Спасибо.