Я размещаю приложение .NET Core в MS Azure (в плане обслуживания Linux) и хочу запустить некоторый код NodeJS в приложении .NET Core. Я сделал это некоторое время назад в плане обслуживания Windows, там это работало. Теперь я пытаюсь использовать план Linux, и он не работает.
Сначала я пытался использовать «Jering.Javascript.NodeJS», а затем также «INodeServices» от Microsoft (который устарел). Но «узел» не был найден. Я также пытался запустить непосредственно процесс (код ниже), но тоже не работал. "узел" не найден.
var proc = new System.Diagnostics.Process
{
StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "node",
Arguments = " -v",
RedirectStandardOutput = true
}
};
result += "RUN: " + proc.StartInfo.FileName;
proc.Start();
var reader = proc.StandardOutput;
NodeJS установлен на сервере, а также команда там работает, но кажется, что приложение .NET Core размещено как докер и не имеет доступа извне для запуска NodeJS. Изображение





Нашла полезную информацию здесь.
Проблема в том, что Node отсутствует в контейнере, поэтому он необходимо иметь скрипт для установки и запускать его перед запуском само приложение.
Воспроизвести:
Вот мой сценарий:
//using System.Diagnostics;
ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = "bash";
//startinfo.FileName = "/etc/opt/nodejs/14.15.0/bin/node"; //it's no use even node package located here.
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
//install and start nodejs
process.StandardInput.WriteLine("apt-get install curl");
process.StandardInput.WriteLine("curl -sL https://deb.nodesource.com/setup_12.x | bash");
process.StandardInput.WriteLine("apt-get install -y nodejs");
//Run "node -v"
process.StandardInput.WriteLine("node -v");
string line = string.Empty;
while (!process.StandardOutput.EndOfStream)
{
line = process.StandardOutput.ReadLine();
_logger.LogInformation(line);
}
process.WaitForExit();
return string.Empty;
Он работает в моем приложении .net Core на базе Linux.
Никаких дополнительных настроек на портале, я просто запускаю скрипт прямо в своем приложении. @Майкл Экхарт-Вёллькарт
Спасибо за быстрый ответ. Но это означает, что время запуска приложения сильно увеличивается, верно?
Да, это приведет к увеличению времени запуска... Но ненамного. @MichaelEckhart-Wöllkart
Спасибо, может быть, я нашел лучшее решение, если хотите, вы можете взглянуть на мой ответ.
Я думаю, что нашел лучшее решение;) В службе приложений вы можете подключить хранилище. В моем случае я смонтировал хранилище, содержащее библиотеку nodeJS. Скриншот портала Azure
Теперь я могу выполнить следующий код:
string result = "";
var proc = new System.Diagnostics.Process
{
StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "/externallibs/node/bin/node",
Arguments = " -v",
RedirectStandardOutput = true
}
};
result += "RUN: " + proc.StartInfo.FileName;
proc.Start();
var reader = proc.StandardOutput;
return result + reader.ReadToEnd();
Это прекрасно! Спасибо, что поделились, Майкл.
Добро пожаловать ;) Если вы добавите еще что-то подобное, вы также можете использовать только «узел» и не обязательно использовать весь путь. "Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + @":/externallibs/node/bin");"
Вы можете создать на портале Azure переменную среды с именем POST_BUILD_COMMAND с командой, чтобы исправить путь к среде.
Планы обслуживания Linux работают на Oryx, что задокументировано здесь
POST_BUILD_COMMAND=PATH=/usr/bin/node:$PATH
Проблема была не в отсутствующей переменной окружения. Весь узел js недоступен в службах приложений Linux. Но это можно исправить с помощью моего вопроса ниже или с помощью докера и установки nodejs прямо в образе.
Взгляните на документы AppService . Вы можете использовать клиент Azure в службе приложений для получения списка всех доступных сред выполнения с помощью команды «az webapp list-runtimes --linux» или az webapp list-runtimes --os windows
в службе приложений Linux доступны десятки сред выполнения, включая node. Взгляните на следующий список: «DOTNETCORE», «NODE», «PYTHON», «PHP», «RUBY», «JAVA», «JBOSS», «TOMCAT».
Вы запускаете этот скрипт прямо в приложении? Чтобы при каждом запуске скрипт выполнялся, или в лазурном портале есть настройка?