HttpListener в C # не получил все запросы от Google Actions Server, как его решить? - PullRequest
0 голосов
/ 28 мая 2019

Я создаю сервер умного дома и хочу поддерживать действия Google Умного дома.Серверное приложение написано на C # с использованием HttpListener, и я использую Mono 5.18 (5.20 версии имеют проблемы с httpcfg) для запуска на сервере Debian 10.Серверное приложение работает правильно, но 1 из 5 запросов не получен в программе.Tcpdump показывает некоторый тип трафика, но приложение не получает.

Я пытался переустановить Debian 2 раза, используя другую моно версию, изменив порт, запустив его в Windows 10, отключив часть кода, в которой он поддерживает MQTT и MySQL, отключив брандмауэр, и ничего не произошло.Основная проблема заключается в том, что Google Server не отправляет пакеты после одного сбоя, и я должен отключить и повторно подключить свои устройства в Google Home App.

Мой код с HttpListner:

static HttpListener listener;
//...

static void Main(string[] args)
{
        //...
        HttpServiceMain();
}

//...

private static void HttpServiceMain()
{

    listener = new HttpListener();
    listener.Prefixes.Add("https://*:2030/");
    listener.Start();

    while (true)
    {
        ProcessRequest();                               
    }
}

static void ProcessRequest()
{
    var result = listener.BeginGetContext(ListenerCallback, listener);
    var startNew = Stopwatch.StartNew();
    result.AsyncWaitHandle.WaitOne();
    startNew.Stop();
    Console.WriteLine("Elapsed miliseconds: " + startNew.ElapsedMilliseconds);
}

static void ListenerCallback(IAsyncResult ar)
{
    Console.WriteLine("Listening...");
    HttpListenerContext context = listener.EndGetContext(ar);
    HttpListenerRequest request = context.Request;

    string documentContents;

    using (Stream receiveStream = request.InputStream)
    {
        using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
        {
            documentContents = readStream.ReadToEnd();
        }
    }

    string responseString = "{}";

    //Creating response and exporting it to 'responseString'
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
    HttpListenerResponse httpResponse = context.Response;
    httpResponse.StatusCode = 200;
    httpResponse.StatusDescription = "OK";
    httpResponse.ContentLength64 = buffer.Length;
    System.IO.Stream output = httpResponse.OutputStream;
    output.Write(buffer, 0, buffer.Length);
    httpResponse.Close();
}

Как я уже сказал, все работает нормально в 4 из 5 раз, но после некоторых запросов сервер не получил запрос, и я должен повторно подключить Google Home App к своему сервису.Это ошибка в HttpListener, в моем коде или в Google Server?У тебя есть идеи?

...