Как я могу запустить и запросить ngrok в Linux из C#. NET Core 2.2? - PullRequest
0 голосов
/ 26 марта 2020

У нас есть консольное веб-приложение на основе kestrel, которое автоматически запускает ngrok при запуске. Мы используем Process.Start (), указывающий на ngrok.exe, затем в том же C# мы запрашиваем http://127.0.0.1: 4040 / api / tunnels , чтобы получить URL-адрес ngrok, чтобы мы могли синхронизировать c к внешней зависимости.

Это работает в Windows. В Linux - я использую MX Linux - когда я перебираю код в Rider, Process.Start возвращает true, и к тому времени, когда мы достигаем код для запроса http://127.0.0.1: 4040 / api / tunnels объект процесса все еще говорит .HasExited == false. Однако в этот момент происходит сбой (соединение отказано), и если я открываю другой терминал и wget -O - http://127.0.0.1:4040/api/tunnel, который также не может подключиться, так что я действительно запутался, ngrok запустился или нет? Если в терминале я вручную перехожу туда, где исполняемый файл Linux для ngrok, и передаю те же аргументы, которые я передавал в Process.Start (), он запускается, заполняет экран, открывает другой терминал и пытается wget -O - http://127.0.0.1:4040/api/tunnel он успешно соединяется и возвращает выходные данные.

Я имею в виду, если процесс не запускается с C#, почему Process.Start() возвращает true? .. и почему объект процесса, даже после некоторого потока сна, скажет .HasExited == false?

1 Ответ

0 голосов
/ 26 марта 2020

Я только что понял это. Я догадывался, что это связано с тем, что консольные потоки блокируются некоторыми деталями ProcessStartInfo, поскольку использование оболочки в Linux работает иначе, чем Windows. Вот рабочий код, отмечающий изменение, добавляющее блок if в начале:

 if (Company.RuntimeEnvironment.IsLinux && showWindow == "true")
     { showWindow = "false"; }
 var process = new Process
 {
     StartInfo =
     {
        FileName = FileNgrokExecutable,
        CreateNoWindow = showWindow != "true" && showWindow != "integrated",
        RedirectStandardOutput = showWindow != "true" && showWindow != "integrated",
        RedirectStandardError = showWindow != "true" && showWindow != "integrated",
        UseShellExecute = showWindow == "true",
        Arguments = $"http {localPort} -host-header=localhost"
    }
};
...